字节流和字符流的输入和输出
- IO:
- 输入流:
- 输出流:
- 字节输入流:以字节为单位读取数据.
- 字节输出流:以字节为单位输出的数据.
- 字符输入流;以字符为单位读取数据.
- 字符输出流:以字符为单位输出的数据.
常用的方法;
|
package com.heima.zifu;
import java.io.File; import java.io.FileOutputStream; //FileOutputStream类 public class Demo02 { public static void main(String[] args) throws Exception{ //使用File创建字节流对象 File file=new File("D:\\LULIANGHM\\JAVAEE\\Day10\\c.txt"); FileOutputStream fos=new FileOutputStream(file,true);//抛出异常 //字符串转换成字节数组 byte [] b="abcde".getBytes(); //写出位置从2开始,2个字节.索引为2 fos.write(b,2,2); //数据追加在参数后面加一个true fos.write(98); //写出数据 fos.write(97);//写出一个字节a //遍历数组 for(int i=0;i<b.length;i++){ //写出一个字节 fos.write(b[i]); //写出一个换行,换行符号转成数组写出 fos.write("\r\n".getBytes()); } //关闭资源 fos.close(); } } |
|
- FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
- FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException 。
1 package com.heima.zifu; 2 import java.io.FileInputStream; 3 public class Demo05 { 4 public static void main(String[] args) throws Exception { 5 //使用文件名创建流对象 6 FileInputStream fis=new FileInputStream("D:\\LULIANGHM\\JAVAEE\\Day10\\c.txt"); 7 //定义变量,保存数据 8 int a; 9 10 while ((a=fis.read())!=-1){ 11 //字节💗转换为字符型 12 System.out.println((char) a); 13 } 14 //关闭资源 15 fis.close(); 16 }
使用字节数组读取:
1 package com.heima.zifu;
2
3 import java.io.FileInputStream;
4
5 public class Demo06 {
6 public static void main(String[] args) throws Exception{
7 FileInputStream fis=new FileInputStream("D:\\LULIANGHM\\JAVAEE\\Day10\\c.txt");
8 //定义变量
9 int len;
10 byte[] b=new byte[2];
11 //循环获取
12 while ((len=fis.read(b))!=-1){
13 //new String(b)转换为字符串形式显示
14 System.out.println(new String(b));
15 }
16 //关闭资源
17 fis.close();
18 }
19 }
输出结果:as
da
sd
as
da
sd
错误数据:d 由于最后一次读取时候,自读取一个字节e,数组中,上次读取的时候没有完全被替代,所以要获取有效字节
修改: System.out.println(new String(b));修改成
len每次读取的有效字节个数.
System.out.println(new String(b,0,len));
字节流练习:图片复制:
1 package com.heima.tupian;
2
3 import java.io.FileInputStream;
4 import java.io.FileOutputStream;
5
6 /*
7 使用字节流来拷贝一张图片
8 需求:把G:\ccc\hb.jpg图片拷贝到day09\\hb.jpg
9 IO流的核心代码:
10 1.创建输入流对象,封装数据源文件
11 2.创建输出流对象,封装目的地文件
12 3.定义变量,用来存储读取到的数据
13 4.只要满足条件就一直循环读取数据
14 5.写出数据
15 6.关闭流,释放资源
16 */
17 public class Demo01 {
18 public static void main(String[] args) throws Exception{
19 //1.创建字节输入流对象,封装数据源文件
20 FileInputStream fis=new FileInputStream("C:\\Users\\ASUS\\Desktop\\截图\\11111.jpg");
21 //1.2创建输出流对象,封装数据原文件
22 FileOutputStream fos=new FileOutputStream("D:\\LULIANGHM\\JAVAEE\\Day10\\sss.jpg");
23 //定义变量用于存储读取到的数据
24 byte[] bytes=new byte[1024];
25 //定义长度
26 int len;
27 //循环读取
28 while ((len=fis.read(bytes))!=-1){
29 //写出数据
30 //边写出边读取
31 fos.write(bytes,0,len);
32 }
33 //释放资源
34 //先释放输出流在释放输出流
35 fos.close();
36 fis.close();
37
38 }
39 }
|
当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream 。 |
|
当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。 |
package com.heima.zijie;
import java.io.FileWriter;
public class Demo01 {
public static void main(String[] args) throws Exception{
//基本写出数据
//使用文件名称创建流对象
FileWriter fw=new FileWriter("D:\\LULIANGHM\\JAVAEE\\Day10\\d.txt");
// 字符串转换为字节数组
char[]chars="黑马程序园".toCharArray();
//写出字符串
fw.write(chars);
// 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。
fw.write(chars,2,2); // 程序
//写出数据
fw.write(97);
fw.write('b');
fw.write(30000);
for(int i=0;i<chars.length;i++){
System.out.println(chars[i]);
}
//关闭系统释放资源
fw.close();
}
}
package com.heima.biji;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
public class Demo03 {
public static void main(String[] args) {
// 字节流一次读写一个字节数组来拷贝文件
try (FileInputStream fis = new FileInputStream("day09\\a.txt")) {
try (FileOutputStream fos = new FileOutputStream("day09\\aCopy.txt")) {
// 1.创建输入流对象,封装数据源文件
// 2.创建输出流对象,封装目的地文件
// 3.定义变量,用来存储读取到的数据
byte[] bys = new byte[3];// 用来存储读取到的字节数据
int len;// 用来存储有效字节数
// 4.只要满足条件就一直循环读取数据
while ((len = fis.read(bys)) != -1) {
// System.out.println(new String(bys,0,len));
// 5.写出数据 写有效字节数 write(byte[] b, int off, int len)
fos.write(bys);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* jdk1.7之前
*/
private static void method10() {
FileReader fr = null;
FileWriter fw = null;
// jdk之前的, 也是现在常用的
try {
// 1.创建输入流对象,封装数据源文件
fr = new FileReader("G:\\ccc\\a.txt");
// 2.创建输出流对象,封装目的地文件
fw = new FileWriter("day09\\aa.txt");
// 3.定义变量,用来存储读取到的数据
int len;
// 4.只要满足条件就一直循环读取数据
while ((len = fr.read()) != -1) {
// 5.写出数据
fw.write(len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 一般永远都会执行,一般用来释放资源
//6.关闭流,释放资源
try {
if (fw != null) {
fw.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
基本的存储方法
|
代码演示:
package com.heima.biji;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.Set;
/*
java.util.Properties 继承于Hashtable 实现了Map接口,来表示一个持久的属性集
特点:属性列表中的每个键及其对应的值都是一个字符串
构造方法
- public Properties() :创建一个空的属性列表。
基本的存储方法
- public Object setProperty(String key, String value) : 保存一对属性。 添加键值对 put()
- public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。 get()
- public Set<String> stringPropertyNames() :所有键的名称的集合。 keySet()
和流相关的方法
- public void load(InputStream inStream): 从字节输入流中读取键值对。
参数中使用了字节输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了。
*/
public class Demo04 {
public static void main(String[] args)throws Exception {
//day01();//Properties类的构造方法
//创建属性对象
Properties properties = new Properties();
//加载文本中信息到属性集合
properties.load(new FileInputStream("D:\\LULIANGHM\\JAVAEE\\Day10\\c.txt"));
//遍历集合打印
Set<String> strings = properties.stringPropertyNames();
for (String key : strings) {
System.out.println(key+"--"+properties.getProperty(key));
}
}
private static void day01() {
//创建属性集的对象
Properties properties = new Properties();
//添加健值对象
properties.setProperty("djalskdjaa","a.txt");
properties.setProperty("lu","adasdasdas");
properties.setProperty("liang","dasdsadasd");
System.out.println(properties);
//通过健获取属性值
System.out.println(properties.getProperty("lu"));
System.out.println(properties.getProperty("liang"));
//遍历集合
Set<String> strings = properties.stringPropertyNames();
for (String string : strings) {
System.out.println(string+"---"+properties.getProperty(string));
}
}
}
/*
输出结果:
{djalskdjaa=a.txt, lu=adasdasdas, liang=dasdsadasd}
adasdasdas
dasdsadasd
djalskdjaa---a.txt
lu---adasdasdas
liang---dasdsadasd
*/
utf8编码: 一个中文占3个字节
idea开发工具: 默认编码为utf8
Windows默认编码: gbk
如果该文件使用记事本打开看得懂,就用字符流
如果该文件使用记事本打开看不懂,就用字节流
字节流可以拷贝一切类型文件,但是字符流不一定
posted on 2019-03-31 20:03 风一般的男子·小亮 阅读(1010) 评论(1) 编辑 收藏 举报