笔记-迎难而上之Java基础进阶6
import java.io.*; public class inputstreamdemo{ public static void main(string[] args) throws ioexception{ //创建输入流对象,创建对象时绑定读取的数据源 fileinputstream fis = new fileinputstream("e:\\study\\demo12\\c.txt"); //创建byte[] 数组,让他一次性读取多个字节 byte[] bytes = new byte[1024]; int len=0; //用len来接收读取到的有效字节 //因为文件中有5个字节,所以把五个字节传递给len while((len=fis.read(bytes))!=-1){ //string的构造方法,可以把字节数组变成字符串 system.out.println(new string(bytes)); } fis.close(); } }
文件复制
package demo16; import java.io.*; public class copydemo{ public static void main(string[] args) throws ioexception{ //创建fileinputstream对象,需要指定读取的数据源文件的位置 fileinputstream fis = new fileinputstream("c:\\cloudmusic\\mv\\周二珂 - 告白气球.mp3"); //绑定要输出的的数据目的地 fileoutputstream fos = new fileoutputstream("e:\\study\\demo13\\周二珂 - 告白气球.mp3"); //创建字节数组,让他一次性读取多个文件 byte[] bytes = new byte[1024]; //创建一个整数变量,让他接收读取到的有效字节和写入的有效字节 int date = 0; //当读取到文件末尾时会返回-1,只要读取的字节不等于-1,就继续读取 //把读取到的有效字节,赋值给date,只要不等于-1,就写入文件 //从输入流中读取一些字节数并将它们存储到缓冲区数组bytes中。 while((date=fis.read(bytes))!=-1){ //读一个字节写一个字节 //为什么写入的数据是bytes??,因为读取的数据就存储到bytes中 fos.write(bytes,0,date); } fos.close(); fis.close(); } }
字符输入流reader类
reader类是字符流最顶层的类
成员方法:
- int read() 读取单个字符并返回
- int read(char[] cubf)一次性读取多个字符,将字符读入数组
- void close() 关闭流并释放资源
filereader继承了reader
构造方法 filereader(string filename) 参数是一个文件的路径
filereader(file file) 参数是一个文件
字符输入流读取字符数据
import java.io.*; public class readerdemo{ public static void main(string[] args) throws ioexception{ //字符流的创建,需要绑定数据源 //绑定了文件路径,也可以绑定文件 filereader fr = new filereader("e:\\study\\demo13\\a.txt"); //使用循环来读取文件 /*int len = 0; //read(),返回的是读取到的字符 while((len=fr.read())!=-1){ system.out.println((char)len); }*/ int len = 0; //试一下用数组来读取文件 //定义一个字符数组,他是用来存储读取到的字符 char[] cs = new char[1024]; while((len=fr.read(cs))!=-1){ //string的构造方法,可以把字符数组转换成字符串 system.out.println(new string(cs,0,len)); } fr.close(); } }
字符输出流的基本使用_写单个字符到文件
public static void main(string[] args) throws ioexception{ //创建filewriter对象,绑定写入的数据目的地 //如果没有文件会创建文件 filewriter fw = new filewriter("e:\\study\\demo13\\b.txt"); //write(int c)写入单个字符, fw.write(97);//这里只是把数据写入到内存缓冲区中 //需要flush()把存在内存缓冲区的数据写入到文件中 fw.flush(); fw.close(); }
flush方法和close方法的区别
flush:刷新缓冲区,流对象可以继续使用
close:先刷新缓冲区,通知系统释放资源,流对象不能再使用
字符输出流写数据的其他方法
import java.io.*; public class writerdemo1{ public static void main(string[] args) throws ioexception{ filewriter fw = new filewriter("e:\\study\\demo13\\d.txt"); //void write(char[] cbuf)可以写入字符数组 char[] cs = {'云','想','衣','裳','花','想','容'}; fw.write(cs); //写入字符数组的一部分,从索引2开始写,写四个字符 fw.write(cs,2,4); //写字符串 fw.write("春风扶槛露华浓"); //写一部分字符串 fw.write("若非群玉山头见",0,3); fw.close(); } }
字符输出流的续写和换行
public class writedemo2{ public static void main(string[] args){ //如若参数为false,则会覆盖源文件,为true会在源文件的后面续写 filewriter fw = new filewriter("e:\\study\\demo13\\f.txt",true); fw.write("云想衣裳花想容"); //换行符是\r\n fw.write("\r\n"+"春风扶槛露华浓"); fw.write("\r\n"+"若非群玉山头见"); fw.write("\r\n"+"会向瑶台月下逢"); fw.close(); //现在仿佛执行程序都不会覆盖源文件 } }
properties集合存储数据
properties类表示了一个持久的属性集,properties 可保存在流中或从流中加载
properties集合是一个唯一和io流相结合的集合
//propertiesdemo集合的常见方法和使用 import java.util.*; public class propertiesdemo{ public static void main(string[] args){ //创建properties集合的对象 properties prop = new properties(); //调用properties的方法setproperty prop.setproperty("李白","18"); prop.setproperty("杜甫","22"); prop.setproperty("苏轼","25"); //取出键 set<string> set = prop.stringpropertynames(); //遍历set,通过k获取v for(string key : set){ string value = prop.getproperty(key); system.out.println(key+" "+value); } } }
properties集合中的方法store
void store(outputstream out, string comments),字节输出流,不能写入中文
void store(writer writer,string comments)字符输出流,可以写中文
import java.util.*; import java.io.*; public class propertiesdemo{ public static void main(string[] args) throws ioexception{ //创建properties集合的对象 properties prop = new properties(); //调用properties的方法setproperty prop.setproperty("李白","18"); prop.setproperty("杜甫","22"); prop.setproperty("苏轼","25"); //properties集合中的方法store,可以把集合中的临时数据写入到硬盘中去 filewriter fw = new filewriter("e:\\study\\demo13\\e.txt"); prop.store(fw,"save date"); fw.close(); } }
properties集合中的方法load
可以使用properties集合中的方法load,把硬盘中保存的文件,读取到集合中使用
void load(inputstream instream)字节输入流,不能读取中文的键值对
void load(reader reader)字符输入流,能读取含有中文的键值对
public static void main(string[] args) throws ioexception{ properties prop = new properties(); prop.load(new filereader("e:\\study\\demo13\\e.txt")); set<string> set = prop.stringpropertynames(); for(string key :set){ string value = prop.getproperty(key); system.out.println(key+"="+value); } }
bufferedoutputstream_字节缓冲输出流
bufferedoutputstream继承自outputstream
bufferedoutputstream的构造方法:
bufferedoutputstream(outputstream out):创建一个新的缓冲输入流,已将数据写入指定的底层输出流
bufferedoutputstream(outputstream out,int size):创建一个新的缓冲输入流,已将数据写入指定的底层输出流,并且指定缓冲区的大小
import java.io.*; public class bufferedoutputstreamdemo { public static void main(string[] args) throws ioexception{ fileoutputstream fos = new fileoutputstream("e:\\study\\demo13\\g.txt"); bufferedoutputstream bos = new bufferedoutputstream(fos); bos.write("云想衣裳花想容".getbytes()); bos.close(); } }
bufferedinputstream_字节缓冲输入流
import java.io.*; public class bufferedinputstreamdemo { public static void main(string[] args) throws ioexception{ fileinputstream fis = new fileinputstream("e:\\study\\demo13\\g.txt"); bufferedinputstream bis = new bufferedinputstream(fis); int len=0; while((len=bis.read())!=-1){ system.out.println((char)len); } bis.close(); } }
bufferedwriter_字符缓冲输出流
//这段代码在编译器不报错,在命令行一直报错 public static void main(string[] args) throws ioexception{ //创建字符缓冲输出流 bufferedwriter bw = new bufferedwriter(new filewriter("e:\\study\\demo13\\h.txt")); //调用方法写入字符 for(int i=0;i<10;i++){ bw.write("云想衣裳花想容"); bw.newline(); } //关闭流,同时flush把缓冲区的数据,刷新到文件中 bw.close(); }
bufferedreader_字符缓冲输入流
public static void main(string[] agrs) throws ioexception{ //创建一个bufferedreader对象 bufferedreader br = new bufferedreader(new filereader("e:\\study\\demo13\\h.txt")); //调用方法read或者readline,readline返回的是一行,没有就返回null string line; while((line=br.readline())!=null){ system.out.println(line); } br.close(); }
文本排序练习
import java.io.*; import java.util.hashmap; //把一个打乱序号的文本恢复正常的排序 public class copydemo{ public static void main(string[] args) throws ioexception{ //分别存储序号和文本 hashmap<string,string> hm = new hashmap<>(); bufferedreader br = new bufferedreader(new filereader("e:\\study\\demo13\\k.txt")); bufferedwriter bw = new bufferedwriter(new filewriter("e:\\study\\demo12\\k.txt")); string line; while((line=br.readline())!=null){ //将字符串进行切割,返回的是一个字符串数组,分别有索引0和索引1 //可以把0为序号,1为文本内容 //调用字符串的切割文本方法 string[] arr = line.split("\\."); //key值会自动排序 hm.put(arr[0],arr[1]); } //keyset会把hashmap的键全部取出来,放到一个集合中 //遍历这个集合就可以拿到key for(string key : hm.keyset()){ string value=hm.get(key); line = key +"."+value; //读一行,写一行 bw.write(line); bw.newline(); } bw.close(); br.close(); } }
转换流
outputstreamwriter:
构造方法
outputstreamwriter(outputstream out)
outputftreamwriter(outputstream out, string charsename)
参数outputstream:字节输出流,可以用来写转换之后的字节到文件中
参数string charsetname:编码名称
使用步骤:
创建outputstreamwrite对象,构造方法中传递字节输出流和编码名称
使用outputstreamwriter对象中的方法write,把字符转换为字节存储缓冲区中
-
使用outputstreamwriter对象中的方法flush
import java.io.*; public class outputstreamwriterdemo{ public static void main(string[] args) throws ioexception{ gbk_write(); } public static void utf_8_write() throws ioexception{ //传递一个字节输出流的对象,默认编码表是utf-8 outputstreamwriter osw = new outputstreamwriter(new fileoutputstream("e:\\study\\demo13\\i.txt")); osw.write("云想衣裳花想容"); osw.flush(); osw.close(); } public static void gbk_write() throws ioexception { outputstreamwriter osw = new outputstreamwriter(new fileoutputstream("e:\\study\\demo13\\j.txt"),"gbk"); osw.write("春风扶槛露华浓"); osw.flush(); osw.close(); } }
inputstreamreader类
可以按照指定的编码表来解码
构造方法:
inputstreamreader(inputstream in)
inputstreamreader(inputstream in,string charsetname)
import java.io.fileinputstream; import java.io.ioexception; import java.io.inputstreamreader; public class inputstreamreaderdemo { public static void main(string[] args) throws ioexception { //read_utf_8(); read_gbk(); } private static void read_gbk() throws ioexception { //读取gbk文件 inputstreamreader isr = new inputstreamreader(new fileinputstream("e:\\study\\demo13\\j.txt"),"gbk"); int len=0; while ((len=isr.read())!=-1){ system.out.println((char)len); } isr.close(); } private static void read_utf_8() throws ioexception { //读取utf-8文件 inputstreamreader isr = new inputstreamreader(new fileinputstream("e:\\study\\demo13\\i.txt")); int len=0; while ((len=isr.read())!=-1){ system.out.println((char)len); } isr.close(); } }