黑马程序员技术交流社区
标题:
【记录】代码练习-字节流
[打印本页]
作者:
Kevin.Kang
时间:
2015-7-24 14:47
标题:
【记录】代码练习-字节流
本帖最后由 Kevin.Kang 于 2015-7-27 16:53 编辑
IO流分类:(默认情况按照数据类型分)
流向:(以java程序为参照物)
输入流:读取数据
输出流:写入数据
数据类型:
字节流
字节输入流:
读取数据:InputStream
字节输出流:
写入数据:OutputStream
字符流
字符输入流:
读取数据:Reader
字符输出流:
写入数据:Writer
用系统自带的笔记本打开,读得懂的可以用字符流,读不懂就只能用字节流。
作者:
Kevin.Kang
时间:
2015-7-24 16:31
package com.kxg.IO;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 需求:往一个.txt文件里面写入hello,worle
*
* 往文件里面写入数据用OutputStreamhen
* 因为OutputStreamhen是抽象类,所以要用它的子类FileOutputStream
*/
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
// 创建字节流对象
FileOutputStream fos = new FileOutputStream("a.txt");
// 调用write()方法
fos.write("hello,world".getBytes());
// 释放资源
fos.close();
}
}
复制代码
创建字节流对象一共做了三件事:
1.如果a.txt文件不存在,就创建一个a.txt文件
2.创建fos对象
3.把fos对象指向a.txt文件
write()方法:
public void write(byte[] b)throws IOException
public void write(byte[] b,int off,int len)throws IOException
public abstract void write(int b)throws IOException
write()方法需要传入的是字节数组,
把需要传入的字符串转为字节数组传入就行。
close():释放资源
让流对象变成垃圾,可以被垃圾回收器回收
通知系统释放跟该文件相关的资源
作者:
Kevin.Kang
时间:
2015-7-24 16:45
本帖最后由 Kevin.Kang 于 2015-7-24 16:46 编辑
Write()方法:
package com.kxg.IO;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* write()方法:
* public abstract void write(int b):写一个字节
* public void write(byte[] b):写一个字节数组
* public void write(byte[] b,int off,int len):写一个字节数组的一部分
*/
public class WriteDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write(97);// 97底层二进制数据,通过记事本打开,记事本找到97对应的字符值就是a
fos.write("hello,java".getBytes());
byte[] by = { 97, 98, 99, 100 };
fos.write(by, 0, 2);// 包前不包后,包含0不包含2
fos.close();
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-24 17:04
本帖最后由 Kevin.Kang 于 2015-8-28 11:30 编辑
数据换行和追加写入:
package com.kxg.IO;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
/*
* 需求:数据换行以及追加写入
*/
public class WriteDemo2 {
public static void main(String[] args) throws IOException {
// 构造方法的可以实现追加写入
FileOutputStream fos = new FileOutputStream("a.txt", true);
Scanner sc = new Scanner(System.in);
System.out.println("输入内容:");
String s = sc.nextLine();
fos.write(s.getBytes());
fos.write("\r\n".getBytes());
fos.close();
}
}
复制代码
数据换行:
不同的系统识别不同的换行符号
windows:\r\n
linux:\n
MAC:\R
常见的高级记事本所有的都可以识别。
数据追加写入:
利用构造方法可以实现数据追加写入,每运行一次就写入一次。
作者:
Kevin.Kang
时间:
2015-7-24 17:22
读取数据:
package com.kxg.IO;
import java.io.FileInputStream;
import java.io.IOException;
/*
* 读取数据:
* 字节输入流
* 创建字节输入流对象
* 用read()方法,把结果显示在控制台
* 释放资源
*
* read()方法:
* public int read():一次读一个字节
* public int read(byte[] b):一次对一个字节数组
* public int read(byte[] b,int off,int len):一次对一个字节数组的一部分
*/
public class ReadDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
// 第一次读取
// int i = fis.read();
// System.out.println(i);
// System.out.println((char) i);//返回的是int类型的值,需要强制转换为char
//
// 第二次读取
// i = fis.read();
// System.out.println(i);
// System.out.println((char) i);
// System.out.println("===================");
// while循环改进
int by = 0;// 初始化变量
// 读取到最后再往后读就是-1,不等于-1的时候全打印出来
while ((by = fis.read()) != -1) {
System.out.print((char) by);
}
// 释放资源
fis.close();
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-24 17:36
本帖最后由 Kevin.Kang 于 2015-7-24 17:49 编辑
复制内容到新文件中去:
package com.kxg.IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 需求:把指定文件内容复制到指定文件里面去。
*
* 数据源:
* a.txt --读取 --FileInputStream
*
* 目的地:
* b.txt --写入 --FileOutputStream
*/
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
// 封装数据源
FileInputStream fis = new FileInputStream("a.txt");
FileInputStream fis2 = new FileInputStream("D:\\Test\\a.txt");
// 封装目的地
FileOutputStream fos = new FileOutputStream("b.txt");
FileOutputStream fos2 = new FileOutputStream("D:\\Test\\Test2\\b.txt");
int i = 0;
while ((i = fis.read()) != -1) {
fos.write(i);
}
while ((i = fis2.read()) != -1) {
fos2.write(i);
}
fis.close();
fos.close();
fis2.close();
fos2.close();
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-24 17:44
汉字的存储:
package com.kxg.IO;
import java.util.Arrays;
/*
* 计算机中汉字存储:
* 一个汉字分为两个字节
* 第一个字节肯定是负数
* 第二个字节常见是负数,可能是正数,然并卵。
*/
public class HanZiDemo {
public static void main(String[] args) {
String s = "汉字";
byte[] by = s.getBytes();
System.out.println(Arrays.toString(by));
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-24 18:10
本帖最后由 Kevin.Kang 于 2015-7-24 18:25 编辑
读取一个字节数组:
package com.kxg.IO;
import java.io.FileInputStream;
import java.io.IOException;
/*
* 一次读取一个字节数组:
* int read(byte[] b) 返回值为读取了几个字节
*/
public class CopyDemo3 {
public static void main(String[] args) throws IOException {
// 封装数据源
FileInputStream fis = new FileInputStream("a.txt");
// 定义一个字节数组
byte[] by = new byte[5];// 一般为1024或者它的倍数
// 第一次读取
// int i = fis.read(by);
// System.out.println(Arrays.toString(by));// 字节数组转为字符数组
// System.out.println(new String(by));// 字节数组转为字符串
// 每一次读取都会替换上一次相同索引的字节,换行符也会被读取。
// 第二次读取
// i = fis.read(by);
// System.out.println(new String(by));
int i = 0;
while ((i = fis.read(by)) != -1) {
System.out.println(new String(by));
}
// 释放资源
fis.close();
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-24 18:31
一次读取一个字节数组复制内容:
package com.kxg.IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 需求:一次读取一个字节数组复制文件
*
*/
public class CopyDemo4 {
public static void main(String[] args) throws IOException {
// 封装数据源
FileInputStream fis = new FileInputStream("a.txt");
FileInputStream fis2 = new FileInputStream("D:\\Test\\a.txt");
// 封装目的地
FileOutputStream fos = new FileOutputStream("b.txt");
FileOutputStream fos2 = new FileOutputStream("D:\\Test\\Test2\\b.txt");
byte[] by = new byte[1024];
int i = 0;
while ((i = fis.read(by)) != -1) {
fos.write(by, 0, i);
}
while ((i = fis2.read(by)) != -1) {
fos2.write(by, 0, i);
}
fis.close();
fos.close();
fis2.close();
fos2.close();
}
}
复制代码
作者:
小灬清新丶
时间:
2015-7-24 18:46
不错,赞一个
作者:
黄新宇
时间:
2015-7-24 19:21
不错,学习了
作者:
Kevin.Kang
时间:
2015-7-27 14:37
字节缓冲区流:
package com.kxg.Buffer;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 缓冲区类(高效类):
*
* BufferedInputStream类:读
* public BufferedInputStream(InputStream in):
* BufferedOuputStream类:写
* public BufferedOutputStream(OutputStream out):
* 构造方法参数问题:
* 字节缓冲区流仅仅提供缓冲区,为高效而设计,真正做读写操作的还是基本的流对象实现。
*/
public class BufferDemo {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("b.txt"));
// int i;
// while ((i = bis.read()) != -1) {
// bos.write(i);
// }
byte[] by = new byte[1024];
int len=0;
while ((len = bis.read(by)) != -1) {
bos.write(by);
}
bis.close();
bos.close();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2