Input:从硬盘到内存
output: 从内存到硬盘
分为字节、字符流
InputStream OutStream是字节流
Reader Writer人能去读,能去写,是字符
Java.io.OutputStream是一切输出流的父类(一个抽象类)
共性的方法,都可以使用
主要用子类
需要注意的点是,无论是字节输出,还是字符输出,读进来的都是int 类型
1.输出流(从程序中往硬盘中读)
package todaty.IO;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStream {
/*
OutputStream是所有输出流的超类,作为一个超类
抽象超类,不太多,主要用子类
主要定义了一些,共性的成员方法
public void close()关闭输出流,并释放系统资源
public void flush()刷新输出流,并强制任何缓冲的输出字节被写出
public void write(byte[] b) 将b.length字节从指定字节数组,写入此字节流
public void write(byte [] b,int off,int len)从指定字节数组写入len字节,从偏移量off开始,输出到此输出流
public abstract void write(int b):将指定字节输出流
*/
/*
工作核心是java.io.FileOutputStream这是OutputStream的子类
构造方法FileOutStream(String name)//String name是目的地的名称,(就是路径)
FileOutputStream(File file)直接往文件中去写
构造方法可以根据文件或者路径创造一个空的文件
然后让对象指向创建好的文件
方法1:创建对象,构造方法里传入目的
2.调用write方法写入数据
3.释放资源,节约内存,使用完毕,清空内存
*/
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\经典\\新建文件夹 (2)\\b.txt");//方法可能会有异常
fos.write(99);//效率太差,一次只能传一个字节
//这个方法抛出的异常都是IO异常的子类,抛出父类异常一个就可以了
/*
public void write(byte[] b) 将b.length字节从指定字节数组,写入此字节流
public void write(byte [] b,int off,int len)从指定字节数组写入len字节,从偏移量off开始,输出到此输出流
可以创建更多流
1.如果第一个字节是正数,显示的时候会查询,ACSII吗表
2.如果第一个字节是负数,显示的时候会查询,默认码表(中文默认码)
*/
byte[] bytes = {
55, 38, 57, 56, 33};//这样查的就是ASCII码表,是英文
byte[] bytes1 = {
-51, 55, -55, 83, 55};//两个字节形成一个字,这里开头是-55的,会和后面一位,形成中文汉字
fos.write(bytes1);//如果后面有单独整数的话,这个整数还是按ASCII来处理
/*
public void write(byte [] b,int off,int len)从指定字节数组写入len字节,从偏移量off开始,输出到此输出流
off是索引数组的下标,len是索引长度
字符串可以用getbytes()方法,转化为字节数组,再用字节流去给输出
*/
byte [] bytes2 = "你好".getBytes();
fos.close();//别忘了省资源
}
}
/*
追加写,续写
FileOutputStream(String name ,boolean append)方法的重载,可以让方法追加到上次写的后面后面为true会继续
在上次文件的末尾,追加写数据
False情况下,创建新文件,覆盖原来的文件
*/
public class Demo02OutputStream {
byte[] bytes1 = {
65,66,67,68};
FileOutputStream fos = new FileOutputStream("D:\\王泽林\\扫雷\\a.txt");
fos.write(bytes1,0,3);
fos.close();//有异常就try或者throws
FileOutputStream fos1 = new FileOutputStream("D:\\王泽林\\扫雷\\a.txt",true);
//追加写开关,进行追加写操作,
fos1.write(88);
fos1.write("\r\n".getBytes());//加入换行符号,字节输出流,需要把字符串变成字节
}
import java.io.FileInputStream;
import java.io.IOException;
/*
java.io.FileInputStream类是所有字节输出流的超类
*/
public class InputStream {
/*
FileinputStream(String name)读取文件的路径
指定路径之后,对象指向路径
使用1.创建对象
2.int read()读取一个字节,每次,读取到末尾会返回-1;
3.使用之后要释放资源
*/
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\sql工具\\a\\txt");
int len = fis.read();
while(len != -1){
System.out.println(len); //循环读读到文件结尾为止
//最后不要忘记优化
}
/*
一次性读取多个字节
int read(byte [] b)
Stringl类的构造方法String(bytes[] bytes)将字节数组转化为字符串
*/
byte[] bytes1 = new byte[2];//数组长度一般定义为1024的倍数1kb
System.out.println(new String(bytes1));
fis.read(bytes1);//输入流中放一个字节数组,是为了,将数据读进这个字节数组里,返回值是一个len代表读了几个字节
//这点与字节输出流完全不一样
//常规流程是
int leen = 0;//记录每次读取的有效字节
while((leen = fis.read(bytes1)) != -1 ){
System.out.println(new String(bytes1));//将数组转化为字符串然后输出
}
fis.close();
}
}
字节输入流,循环的错误写法:
package com.company.DemoShark;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class LearnFile {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\王泽林\\扫雷\\a.txt");
do{
int len = fis.read();
System.out.println((char)len);
}while (fis.read() != -1);
//这种错误循环写法,问题在于,每次fis.read被调用,就已经读进来东西了,我这种写法
//就变成了隔着一个,读一个
}
}
字节流文件复制
1.一读一写而已
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\360安全浏览器下载\\python\\1.jpg");
FileOutputStream fos = new FileOutputStream("D:\\360安全浏览器下载\\python\\2.jpg");
// int len = 0;
// while(( len = fis.read()) != -1){
// fos.write(len);//边读边写
//
//
// }效率太低
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes)) != -1){
//直接用字符数组来读效率很高
fos.write(bytes,0,len);
}
fos.close();
fis.close();
}
}
package com.company.DemoShark;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class LearnFile {
public static void main(String[] args) throws IOException {
/*
文件字符输入流,解决读中文时候容易出现的,乱码问题,中文一般占用三个字节
FileReader()字符输入流
FileWriter()字符输出流
*/
FileReader fr = new FileReader("D:\\王泽林\\扫雷\\a.txt");
while(true){
int len = fr.read();//读进来也是Int
if(len == -1){
break;
}
System.out.println(len);
}
//唯一区别就是使用数组进行输出的时候,使用的是char[] arrayChar
//使用字符数组进行输出
}
}
Properties集合,和IO流结合紧密的集合
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class Demo02Properties {
/*
void store(OutputStream out,String comments)字节输出流
void store(Writer writer, )字符输出流
String comments用来说明保存文件是干什么用的
Properties方法store将集合中临时数据写入硬盘
1.第一步,创建一个Properties集合
2.创建字节流和字符流,确定数据的流向
3.使用Properties集合中store方法,将集合中临时数据,放进硬盘里
4.释放资源
*/
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.setProperty("赵丽颖","168");
properties.setProperty("古力娜扎","118");
properties.setProperty("杨幂","188");
properties.setProperty("周期","158");
FileWriter fos = new FileWriter("D:\\王泽林\\2.txt");//创建一个流
properties.store(fos,"save money");//相当于注释
fos.close();//;利用store方法,将集合中数据写进硬盘
}
}
import java.util.Properties;
import java.util.Set;
public class Demo01Propertist {
/*
Properties集合唯一和IO流结合的
Properties集合中方法store,将集合中的临时数据,持久化,写入到硬盘存储
可以使用Properties集合中方法,load,把硬盘中保存的文件,读取到集合中使用
IO流的一度
Properties是键值对,key和Value都是字符串
setProperties(String key,String value)
String getProperty(String key)
通过key找到value
Set stringPropertyNames()返回键值对集合,存放在一个set集合里
*/
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("赵丽颖","168");
properties.setProperty("古力娜扎","118");
properties.setProperty("杨幂","188");
properties.setProperty("周期","158");
Set<String> set = properties.stringPropertyNames();
for (String key: set
) {
System.out.println(properties.getProperty(key));//通过key取到value
}
}
private static void show02(Set<String> set) {
for (String key: set
) {
System.out.println(key);
}
}
}
package com.company.DemoShark;
import java.io.*;
import java.util.Properties;
import java.util.Set;
public class LearnFile {
/*
Properties集合唯一和IO流结合的
Properties集合中方法store,将集合中的临时数据,持久化,写入到硬盘存储
可以使用Properties集合中方法,load,把硬盘中保存的文件,读取到集合中使用
IO流的一度
Properties是键值对,key和Value都是字符串
setProperties(String key,String value)
String getProperty(String key)
通过key找到value
Set stringPropertyNames()返回键值对集合,存放在一个set集合里
*/
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.setProperty("赵丽颖","168");
properties.setProperty("古力娜扎","118");
properties.setProperty("杨幂","188");
properties.setProperty("周期","158");
properties.store(new FileWriter("D:\\王泽林\\扫雷\\x.txt"),"");
//将集合中数据放进文件中
//方法第二个参数是加个描述
properties.load(new FileReader("D:\\王泽林\\扫雷\\x.txt"));
Set<String> set = properties.stringPropertyNames();//将pro中的key整合起来
for (String str:set
) {
System.out.println(properties.getProperty(str));
}
}
}