八: IO流,数据的读写传输
IO流概括图:

IO流的分类:
按流:
- 输入流(InputStream和Reader):从硬盘或者别的地方读入内存
- 输出流(OutputStream和Writer):从内存里向硬盘或别的地方输出
按操作类型:
- 字节流(InputStream和OutputStream): 字节流可以操作任何数据,因为在计算机中数据以字节的形式存储
- 字符流(Reader和Writer):字符流只能操作纯字符数据,比如文本,以防乱码
以上所述,InputStream、OutputStream、Reader、Writer都是抽象类
缓冲流:
- BufferedInputStream、BufferedOutputStream
- 优点:BufferedInputStream读取时会创建一个长度为8192的byte数组,读完返回-1。不用自己手动创建数组.
字符转换流:
- InputStreamReader和OutputStreamWriter可以设置编码,完成不同编码文件的转换
绝对路径和相对路径:
- 绝对路径:文件在硬盘上真正存在的路径,比如:D:\Java\HelloWorld.java
- 相对路径:只某个文件路径径和别的文件的路径关系 。
使用分隔符解决跨平台的问题:
- 使用File.separator解决不同系统路径问题
- 分隔符: windows: \
- linux : /
- 为了保证代码跨平台,使用File.separator代替分隔符
文件加密和解密:利用两次异或的原理
中文乱码问题: 一个中文占两个字节,如果一次读写入奇数个字节,就有可能乱码,这时候推荐使用字符流解决,一次读一行
字符流读写文件:一次读一行,记得换行bw.newLine()、刷新缓冲区bw.flush()
Code:
- test() :使用FileInputStream、FileOutputStream读取、写入文件中的内容
- test2():使用Buffered缓冲流进行文件拷贝
- test3():文件加密解密,利用两次异或
- test4():使用字节流读取文件乱码问题(一个中文占两个字节)
- test5():对乱码问题给出了解决,可使用字符流Writer、Reader
- test6():使用字符流拷贝文本文件
- test7():使用转换流解决不同文件编码问题
- test8():使用转换流解决不同文件编码问题,乱码解决
package io; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL; import org.junit.Test; public class IODemo {
//定义加密code
static int code = 88;
//定义文件路径
static String fileName = "C:"+File.separator+"Users"+File.separator+"李腾"+File.separator+"Desktop"+File.separator+"写入文件.txt";
static String readName = "C:"+File.separator+"Users"+File.separator+"李腾"+File.separator+"Desktop"+File.separator+"读取文件.txt"; //使用FileInputStream、FileOutputStream读取、写入文件中的内容
@Test
public void test(){
FileInputStream fis = null;
FileOutputStream fos = null;
//绝对路径
String readFile = "D:"+File.separator+"mylog.log";
String writeFile = "D:"+File.separator+"newWrite.txt";
try {
fos = new FileOutputStream(writeFile,true);
fis = new FileInputStream(readFile);
//定义字节数组接收信息
byte[] bytes = new byte[6000];
int temp;
while((temp = fis.read(bytes))!=-1){
fos.write(temp);
//刷新并写出所有缓冲字节
fos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fos.close();
fis.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
//使用Buffered缓冲流进行文件拷贝
@Test
public void test2(){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream("D:"+File.separator+"mylog.log"));
bos = new BufferedOutputStream(new FileOutputStream("D:"+File.separator+"buf.txt"));
int temp;
while((temp=bis.read())!=-1){
bos.write(temp);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bis.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
//文件加密解密,利用两次异或
//JDK7新特性,系统自动close
@Test
public void test3(){
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
//加密
try {
bis = new BufferedInputStream(new FileInputStream("D:"+File.separator+"IO流.rar"));
bos = new BufferedOutputStream(new FileOutputStream("D:"+File.separator+"加密.rar"));
int temp;
while((temp=bis.read())!=-1){
bos.write(temp^code);
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
//解密
try {
bis = new BufferedInputStream(new FileInputStream("D:"+File.separator+"加密.rar"));
bos = new BufferedOutputStream(new FileOutputStream("D:"+File.separator+"解密.rar"));
int temp;
while((temp=bis.read())!=-1){
bos.write(temp^code);
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
} //使用字节流读取文件乱码问题(一个中文占两个字节)
//test5对乱码问题给出了解决,可使用字符流Writer、Reader
@Test
public void test4(){
FileOutputStream fos = null;
FileInputStream fis = null;
String msg = "好好";
try {
fos = new FileOutputStream(fileName);
fis = new FileInputStream(readName);
int temp;
//每次读三个字节,也乱码
byte[] arr = new byte[3];
//每次写三个字节,因为中文占两,所以乱码
fos.write(msg.getBytes(),0,3);
//换行
fos.write("\r\n".getBytes());
fos.flush();
while((temp=fis.read(arr))!=-1){
System.out.println(new String(arr,0,temp));
} } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /* 用字符流解决中文乱码问题
* BufferdReader可以一次读一行文字,readLine方法返回null
* */
@Test
public void test5(){
BufferedReader buf = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
buf = new BufferedReader(new FileReader(readName));
String s;
//写
bw = new BufferedWriter(new FileWriter(fileName));
bw.write("我喜欢学习java");
bw.write(97);
bw.flush();
fw = new FileWriter(fileName);
fw.write("FileWriter写入");
fw.flush();
//读
while((s = buf.readLine())!=null){
// bw.write(s);
System.out.print(s);
}
} catch (IOException e) {
e.printStackTrace();
}
} //使用字符流拷贝文本文件
@Test
public void test6(){
BufferedReader br = null;
BufferedWriter bw = null; try {
br = new BufferedReader(new FileReader(readName));
bw = new BufferedWriter(new FileWriter(fileName));
String s ;
while((s=br.readLine())!=null){
//读一行
bw.write(s);
//读完换行
bw.newLine();
bw.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //使用转换流解决不同文件编码问题
//字符流乱码
@Test
public void test7(){
try(
//将utf-8的内容写出到GBK.txt中,发现乱码
BufferedReader br=
new BufferedReader(new FileReader("D:\\JAVA基础\\7.15\\1javaSe\\file\\utf-8.txt"));
BufferedWriter bw=
new BufferedWriter(new FileWriter("D:\\JAVA基础\\7.15\\1javaSe\\file\\GBK.txt"));
){
String msg;
while((msg=br.readLine())!=null){
bw.write(msg);
}
bw.flush();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //使用转换流解决不同文件编码问题,乱码解决
@Test
public void test8(){
try(
BufferedReader br =
new BufferedReader(new InputStreamReader(new FileInputStream("D:\\JAVA基础\\7.15\\1javaSe\\file\\utf-8.txt"), "utf-8"));
BufferedWriter bw =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\JAVA基础\\7.15\\1javaSe\\file\\GBK.txt"),"GBK")); ){
String msg;
while((msg=br.readLine())!=null){
bw.write(msg);
}
bw.flush();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
八: IO流,数据的读写传输的更多相关文章
- 零基础学习java------day16-----文件,递归,IO流(字节流读写数据)
1.File 1.1 构造方法(只是创建已经存在文件的对象,并不能创建没有的文件) (1)public File(String pathname) (2)public File(String pare ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- java IO流文件的读写具体实例(转载)
引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能 ...
- C# IO流与文件读写学习笔记
本笔记摘抄自:https://www.cnblogs.com/liyangLife/p/4797583.html,记录一下学习过程以备后续查用. 一.文件系统 1.1文件系统类的介绍 文件操作类大都在 ...
- java IO流文件的读写具体实例
IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,Output ...
- IO流数据读写总结
1.用java自带的IO读写方法 官方API网站:http://docs.oracle.com/javase/7/docs/api/ 2.Apache的Commons-io-2.4.jar中的方法,参 ...
- Java IO流之随机读写流RandomAccessFile
随机读写流RandomAccessFile 简介 此类的实例支持对随机访问文件的**读取和写入**. 随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组. 存在指向该隐含数组的光标或索引 ...
- io流对文件读写操作
public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedRead ...
- IO流简要总结
IO流小总结 IO流的本质就是用于数据的传输,根据流的方向的不同,有输入流.输出流.根据数据类型的不同,又有字节流.字符流. 字节流 字节输入流 InputStream 字节输出流 Outpu ...
随机推荐
- Kindle阅读产品体验报告-随时随地畅享阅读
产品入门-第一份产品体验报告Kindle阅读-随时随地畅享阅读时间:2018/11/18-11/22 Kindle阅读 一.产品概括 (1)体验环境 机型:荣耀8 系统:EMUI 8.0(Andr ...
- css3 :default应用场景
引用自 张鑫旭文章.
- 【协作式原创】查漏补缺之Golang中mutex源码实现
概览最简单版的mutex(go1.3版本) 预备知识 主要结构体 type Mutex struct { state int32 // 指代mutex锁当前的状态 sema uint32 // 信号量 ...
- nginx 的precontent阶段的ngx_http_try_files_module模块与mirrors模块介绍
指令介绍 Syntax: try_files file ... uri; try_files file ... =code; Default: — Context: server, location ...
- Linux 修改 .bashrc
bashrc是一个隐藏的文件,要打开并修改该文件需要: (1)命令:ls -a 找到文件 .bashrc: (2) 命令 vim ~/.bashrc 进入到文件: (3) 直接按 i 键可以对文件进行 ...
- Primecoin在windows上的部署和启动服务
Primecoin在windows上的部署和启动服务: 一.从官方获得Primecoin的windows版安装包: 二.一路像安装客户端一样的安装: 三.安装成功后它会自动弹出客户端运行,同步数据, ...
- Java基础 -4.4
For循环 for循环也是一种常规的使用结构 public static void main(String[] args) { for(定义循环的初始值;循环判断;修改循环条件) { 循环语句的执行; ...
- bootloader与启动地址偏移
如果项目工程是IAP+APP,则在keil的APP中要么在修改IROM/IRAM的开始地址和大小,并在MAP中勾选设置. 在NVIC中修改system_stm32f10x.c修改 这个在void Sy ...
- keil条件断点
http://www.keil.com/support/man/docs/uv4/uv4_db_dbg_breakpnts.htm Target Device does not support con ...
- Linux centosVMware 自动化运维认识自动化运维、启动salt相关服务、saltstack配置认证、salt-key命令用法、saltstack远程执行命令、saltstack - grains、saltstack – pillar
一.认识自动化运维 传统运维效率低,大多工作人为完成 传统运维工作繁琐,容易出错 传统运维每日重复做相同的事情 传统运维没有标准化流程 传统运维的脚本繁多,不能方便管理 自动化运维就是要解决上面所有问 ...