Java学习之路(十二):IO流<二>
字符流
- 字符流是可以直接读写字符的IO流
- 使用字符流从文件中读取字符的时候,需要先读取到字节数据,让后在转换为字符
- 使用字符流向文件中写入字符时,需要把字符转为字节在写入文件
Reader和Writer,这两个类是抽象类,一般我们使用的都是他们的子类
FileReader和FileWriter我们一般使用的
FileReader的使用:
- FileReader用于读取字符,调用read方法的时候,是读取一个字符
- read方法的放回值是int,它是把char转成了int
- 以后我们在读取纯文本的文件的时候,使用FileReader这个类,这样的话我们就不许要考虑乱码的问题
一个小小的例子:
package null08051400; import java.io.FileReader;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub FileReader fileReader = new FileReader("D:\\nullnull\\workspace2\\day03\\src\\null08051400\\new1.txt"); int i;
while((i=fileReader.read())!=-1){
System.out.println((char)i);
}
fileReader.close(); } }
FileWriter的使用
和之前的IO流中的write都是一样的,这里我们直接列出一个例子:
package null08051408; import java.io.FileWriter;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub FileWriter writer = new FileWriter("D:\\nullnull\\workspace2\\day03\\src\\null08051408\\1.txt"); writer.write("你好");
writer.write("\r\n");
writer.write("你好");
writer.write("\r\n");
writer.close();
} }
字符流的拷贝
package null08051414; import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
try(
FileReader fileReader = new FileReader("D:\\nullnull\\workspace2\\day03\\src\\null08051400\\new1.txt");
FileWriter fileWriter = new FileWriter("D:\\nullnull\\workspace2\\day03\\src\\null08051414\\1.txt");
){
int i;
while((i=fileReader.read())!=-1){
fileWriter.write(i);
}
}
}
}
方式一:一次一个字符
package null08051419; import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Demo01 {
public static void main(String[] args) throws IOException {
try(
FileReader fileReader = new FileReader("");
FileWriter fileWriter = new FileWriter("");
){
char[] ch = new char[8*1024];
int len;
while((len=fileReader.read(ch))!=-1){
fileWriter.write(ch, 0, len);
}
} } }
方式二:一次多个字符
使用字符流的场景
- 如果是读取文本文件,使用FileReader,不用考虑乱码的问题
- 如果是写入文本文件,不建议使用FileWriter,直接使用FileOutputStream好一些。因为是字节直接写入文件,不需要过多的数据类型的转换
使用FileReader读取字符:先读字节,把字节转成字符(byte===>char)
使用FileWriter写入字符:str转为字符数组,然后是字符转为字节写入文件
带缓冲的字符流
BufferedReader和BufferedWriter
在两个类的内部有一个缓冲区(字符数组)
read方法会读取8*1024个字符
write方法会写入8*1024个字符
package null08051558; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("");
FileWriter fw = new FileWriter(""); BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw); int i;
while((i=br.read())!=-1){
bw.write(i);
}
} }
一个简单的例子
BufferedReader的新方法readLIne()
BufferedWriter的新方法newLine()
package null08051603; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("");
FileWriter fw = new FileWriter(""); BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw); String line = null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();//换行用
}
} }
一个简单的例子
案例:将文本翻转写入留一个文件
package null08051607; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class Demo01 { public static void main(String[] args) throws IOException { //创建一个集合对象,用于存储取出的内容
List<String> list = new ArrayList<String>(); //读取文件写入集合
BufferedReader br = new BufferedReader(new FileReader(""));
String line = null;
while((line=br.readLine())!=null){
list.add(line);
}
//倒叙循环集合,然后输入
BufferedWriter bw = new BufferedWriter(new FileWriter(""));
for(int i=list.size()-1;i>=0;i--){
bw.write(i);
bw.newLine();
}
br.close();
bw.close();
} }
源码
案例:获取文本中字符出现的次数
package null08051614; import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map; //获取一个文本中字符出现的次数 public class Demo01 {
public static void main(String[] args) throws IOException {
Map<Character,Integer> map = new HashMap<Character,Integer>(); FileReader fileReader = new FileReader("");
int i;
while((i=fileReader.read())!=-1){
char ch = (char)i;
if(map.get(ch)==null){
map.put(ch, 1);
}else{
map.put(ch,map.get(ch)+1);
}
}
fileReader.close();
System.out.println(map);
}
}
源码
编码字符流
InputStreamReader:这个类主要用于指定编码的读字符
OutputStreamWriter:这个类主要用于指定编码的写入文件
一个小小的例子:
package null08051624; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; public class Demo01 { public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("");
FileOutputStream fos = new FileOutputStream(""); InputStreamReader isr = new InputStreamReader(fis,"utf-8");
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8"); BufferedReader br = new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(osw); String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
} bw.close();
br.close(); } }
SequenceInputStream序列流
一个小小的例子:使用序列流将多个文件写入到同一个文件中
package null08051633; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream; //将两个文件的内容写到同一个文件中
public class Demo01 {
public static void main(String[] args) throws IOException {
//创建输入流
FileInputStream fis1 = new FileInputStream("");
FileInputStream fis2 = new FileInputStream("");
SequenceInputStream sis = new SequenceInputStream(fis1,fis2); //创建输出流
FileOutputStream fos = new FileOutputStream("");
int i;
while((i=sis.read())!=-1){
fos.write(i);
}
sis.close();
fis2.close();
fos.close(); }
}
package null08051639; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
//多个文件输入到同一个文件
public class Demo01 { public static void main(String[] args) throws IOException {
Vector<InputStream> vector = new Vector<InputStream>(); vector.add(new FileInputStream(""));
vector.add(new FileInputStream(""));
vector.add(new FileInputStream("")); Enumeration<InputStream> e = vector.elements();
SequenceInputStream sis = new SequenceInputStream(e); FileOutputStream fos = new FileOutputStream("");
int i;
while((i = sis.read())!=-1){
fos.write(i);
}
fos.close();
sis.close(); } }
补充:递归
- 就是指在方法的内部调用自己
- 弊端:不能调用的次数过多,容易导致栈内存溢出
- 好处:可以执行不知道循环次数的循环
- 构造方法是不能递归的
- 递归方法可以有返回值
一个小小的例子:求5的阶乘
package null08051649;
public class Demo01 {
public static void main(String[] args) {
int result = s(3);
System.out.println(result);
}
public static int s(int i){
if(i==1){
return 1;
}else{
return i*s(i-1);
}
}
}
一个小小的例子:递归打印一个目录下的所有文件
public static void s(File dir){
File[] currentFileList = dir.listFiles();
for(File item:currentFileList){
if(item.isDirectory()){
s(item);
}else{
System.out.println(item.getAbsolutePath());
}
}
}
Java学习之路(十二):IO流<二>的更多相关文章
- Java学习之路(十二):IO流
IO流的概述及其分类 IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流(读写数据) 输出流(写数据) 流按操作 ...
- Java学习之路(十二):IO流<三>
复习:序列流 序列流可以把多个字节输入整合成一个,从序列流中读取到数据时,将从被整合的第一个流开始读取,读完这个后,然后开始读取第二个流,依次向后推. 详细见上一篇文章 ByteArrayOutput ...
- Java学习之路(十一):IO流<前戏>
File类的概述和构造方法 构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子 ...
- java学习第21天(IO流的使用)
IO流分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 注意: a:如果我们没有明确说明按照什么分,默认按照数据类型分 ...
- Java学习之路(十):异常
---恢复内容开始--- 异常的概述和分类 Throwable类是Java语言中所有错误或者异常的超类(也就是说,Java中所有的报错都是继承与Throwable的),也只有当对象是此类或者此类的子类 ...
- JAVA学习第五十二课 — IO流(六)File对象
File类 用来给文件或者目录封装成对象 方便对文件与目录的属性信息进行操作 File对象能够作为參数传递给流的构造函数 一.构造函数和分隔符 public static void FileDemo( ...
- java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递
1.首先client须要引入 jquery-1.11.1.js 2.其次javawebproject里面须要引入jar包 [commons-beanutils-1.8.0.jar.commons-c ...
- JAVA学习第六十二课 — TCP协议练习
通过练习掌握TCP在进行传输过程中的问题 练习1:创建一个英文大写转换server client输入字母数据,发送给服务端,服务端收到后显示到控制台,并将该数据转成大写返回client,知道clien ...
- JAVA学习第五十七课 — IO流(十一)
一.管道流 PipedInputStream 和 PipedOutPutStream 输入和输出能够直接进行连接.结合线程使用 管道流,顾名思义,写一个读一个.连成一个管子 API文档:管道输入流应该 ...
随机推荐
- Strut2的配置文件strust.xml报错:Package Action extends undefined package struts-default
struts.xml的警告信息,是需要联网验证dtd是否符合规范,只要配置成本地的dtd就会消失, 配置方式请看: 详细请看http://www.cnblogs.com/liuyangfirst/p/ ...
- osgearth
https://max.book118.com/html/2018/0521/167783983.shtm https://baike.1688.com/doc/view-d36134276.html
- Oracle 在not in中使用null的问题
http://www.linuxidc.com/Linux/2012-07/66212.htm 以前还专门小总结过一下Oracle中关于NULL的一些问题,碰巧今天在看书的过程中又看到了另外一个以前没 ...
- Tomcat跨域访问配置
下载cors-filter-1.7.jar,java-property-utils-1.9.jar这两个库文件,放到Tomcat的lib目录下. D:\Program Files\Tomcat-7.0 ...
- subprocess.Popen 运行windows命令出现“句柄无效”报错的解决方法
在框架开发中遇到 subprocess执行多了,就会好句柄无效的问题,终于找到解决方案:如下,修改subprocess中的一点代码就好,也不知道这是不是Python 的bug因为,Python27时没 ...
- C# InDepth 第一章
深入理解C#第一部分,第一章介绍了C#开发得进化史. 1 从数据类型定义引入c#1到4中得改变 c#2:强类型集合(泛型) c#3:自动实现得属性和简化得初始化 c#4:命名实参 2 排序和过滤 排序 ...
- easyui-layout系列之布局(1)
1.Layout布局 通过 $.fn.layout.defaults 重写默认的 defaults. 布局(layout)是有五个区域(北区 north.南区 south.东区 east.西区 wes ...
- Unity的Shader如何控制投影颜色
细节慢慢补充,有几个需要注意的地方,必须要有接收投影的pass也就是Name是ShadowCollector的,必须添加#pragma multi_compile_fwdbase,物体的着色器必须有T ...
- java入门——面向对象
简介 对象具有自己的状态和行为: 描述一个对象具有什么状态和行为的过程叫做建模,不同的意图下我们对同一个事物的描述会产生不同的模型. 类 类描述一类对象的状态和行为的模板.可以把类想象成一个汽车设计图 ...
- 程序媛计划——python爬虫
#用selenium打开百度首页 #第一次运行代码时应该在safari开发者选项中设置'allow remote automation' from selenium import webdriver ...