目录
转换流
基本介绍
应用案例1
应用案例2
打印流
演示PrintStream (字节打印流/输出流)
演示 PrintWriter 使用方式
Properties类
Properties基本介绍
应用案例
本章习题
第一题
第二题
第三题
转换流
基本介绍
Java中的转换流是用来处理字符和字节之间转换的流。转换流在字节输入流和字节输出流之间起到了一个桥梁的作用,它可以将字节流转换成字符流或者将字符流转换成字节流。
Java中提供了两种转换流:InputStreamReader和OutputStreamWriter。InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字符输出流转换成字节输出流。这两种转换流都接收一个字符集名称作为参数,该字符集决定了字节到字符的转换方式。
注意事项
使用InputStreamReader和OutputStreamWriter时需要注意字符集的问题,如果不指定字符集或者指定错误的字符集可能会导致乱码问题。常见的字符集有UTF-8、GBK、ISO-8859-1等。
应用案例1
代码演示:
package com.transformation;
import java.io.*;
/**
* 演示使用 InputStreamReader 转换流解决中文乱码问题
* 将字节流 FileInputStream 转成字符流 InputStreamReader, 指定编码 gbk/utf-8
*/
public class InputStreamReader_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\abc.txt";
//解读
//1. 把 FileInputStream 转成 InputStreamReader
//2. 指定编码 gbk
//InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
//3. 把 InputStreamReader 传入 BufferedReader
//BufferedReader br = new BufferedReader(isr);
//将2 和 3 合在一起
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(filePath), "gbk"));
//4. 读取
String s = br.readLine();
System.out.println("读取内容=" + s);
//5. 关闭外层流
br.close();
}
}
应用案例2
代码演示:
package com.transformation;
import java.io.*;
/**
* 演示 OutputStreamWriter 使用
* 把FileOutputStream 字节流,转成字符流 OutputStreamWriter
* 指定处理的编码 gbk/utf-8/utf8
*/
public class OutputStreamWriter_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\hello.txt";
String charSet = "utf-8";
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charSet);
osw.write("hi, 你好");
osw.close();
System.out.println("按照 " + charSet + " 保存文件成功~");
}
}
打印流
演示PrintStream (字节打印流/输出流)
代码演示:
package com.printstream;
import java.io.IOException;
import java.io.PrintStream;
/**
* 演示PrintStream (字节打印流/输出流)
*/
public class PrintStream_ {
public static void main(String[] args) throws IOException {
PrintStream out = System.out;
//在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器
/*
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
*/
out.print("john, hello");
//因为print底层使用的是write , 所以我们可以直接调用write进行打印/输出
out.write("你好".getBytes());
out.close();
//我们可以去修改打印流输出的位置/设备
//1. 输出修改成到 "e:\\f1.txt"
//2. "hello, 你好" 就会输出到 e:\f1.txt
//3. public static void setOut(PrintStream out) {
// checkIO();
// setOut0(out); // native 方法,修改了out
// }
System.setOut(new PrintStream("e:\\f1.txt"));
System.out.println("hello, 你好");
}
}
演示 PrintWriter 使用方式
代码演示:
package com.transformation;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 演示 PrintWriter 使用方式
*/
public class PrintWriter_ {
public static void main(String[] args) throws IOException {
//PrintWriter printWriter = new PrintWriter(System.out);
PrintWriter printWriter = new PrintWriter(new FileWriter("e:\\f2.txt"));
printWriter.print("hi, 北京你好~~~~");
printWriter.close();//flush + 关闭流, 才会将数据写入到文件..
}
}
Properties类
Properties基本介绍
Java中的Properties是一个可以保存键值对的类。它是Hashtable的子类,因此可以使用Hashtable的方法来查询和操作其中的元素。Properties类常用于读取和写入配置文件,例如数据库连接信息、应用程序设置等。
Properties类中的键和值都是字符串类型。可以使用getProperty(String key)方法通过键获取对应的值。也可以使用setProperty(String key, String value)方法向Properties中添加新的键值对。
Properties常用方法
- getProperty(String key): 获取指定键的值。
- setProperty(String key, String value): 设置指定键的值。
- load(InputStream inStream): 从输入流中加载属性列表。
- load(Reader reader): 从字符输入流中加载属性列表。
- store(OutputStream out, String comments): 将属性列表写入输出流。
- store(Writer writer, String comments): 将属性列表写入字符输出流。
- getProperty(String key, String defaultValue): 获取指定键的值,如果不存在返回默认值。
- stringPropertyNames(): 返回所有的属性键值。
- getPropertyNames(): 返回所有的属性键对象。
- list(PrintStream out): 将属性列表输出到指定的输出流。
- list(PrintWriter out): 将属性列表输出到指定的输出流。
应用案例
代码演示:
package com.properties_;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class Properties02 {
public static void main(String[] args) throws IOException {
//使用Properties 类来读取mysql.properties 文件
//1. 创建Properties 对象
Properties properties = new Properties();
//2. 加载指定配置文件
properties.load(new FileReader("src\\mysql.properties"));
//3. 把k-v显示控制台
properties.list(System.out);
//4. 根据key 获取对应的值
String user = properties.getProperty("user");
String pwd = properties.getProperty("pwd");
System.out.println("用户名=" + user);
System.out.println("密码是=" + pwd);
}
}
本章习题
第一题
代码演示:
要求:
(1)在判断e盘下是否有文件夹my temp ,如果没有就创建my temp
(2)在e: my temp 目录下,创建文件 hello.txt
(3)如果hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
(4)并且在hello.txt 文件中,写入 hello,world~
package com.homework;
import java.io.*;
/*
(1)在判断e盘下是否有文件夹my temp ,如果没有就创建my temp
(2)在e: my temp 目录下,创建文件 hello.txt
(3)如果hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
(4)并且在hello.txt 文件中,写入 hello,world~
*/
public class Homework01 {
public static void main(String[] args) throws IOException {
String directoryPath = "e:\\mytemp";//文件夹的路径
File file = new File(directoryPath);
if (!file.exists()) {//判断mytemp这个文件夹是否存在,如果不存在取反为真,会进入if语句 如果存在取反为false,不会进入if语句
//创建
if (file.mkdirs()) {
System.out.println("创建 " + directoryPath + " 创建成功");
} else {
System.out.println("创建 " + directoryPath + " 创建失败");
}
}
//第一种方法
// String filepath = "hello.txt";
// file = new File(directoryPath, filepath);
//第二种方法
String filepath = directoryPath + "\\hello.txt";
file = new File(filepath);
if (!file.exists()) {//判断文件是否存在,如果存在取反为假会进入else语句,如果文件不存在取反为真会创建文件
if (file.createNewFile()) {
System.out.println(filepath + "文件创建成功");
//文件已经存在写入信息
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
bufferedWriter.write("hello word,你好");//写入信息
bufferedWriter.close();//关闭流
} else {
System.out.println(filepath + "文件创建失败");
}
} else {
System.out.println(filepath + "已经存在不重复创建");
}
}
}
第二题
代码演示:
要求:
使用BufferedReader读取一个文本文件,为每行加上行号再连同内容一开输出到屏幕上。
package com.homework;
import java.io.*;
/*
要求: 使用BufferedReader读取一个文本文件,为每行加上行号再连同内容一开输出到屏幕上。
*/
public class Homework02 {
public static void main(String[] args) {
String path = "e:\\a1.java";
String line = "";
int i = 1;
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(path));
while ((line = bufferedReader.readLine()) != null) {
System.out.println((i++) + "\t" + line);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
//如果把文件的编码 改成了 gbk,出现中文乱码,大家思考如何解决/1.默认是按照 utf-8 处理,开始没有乱码
// /2.提示: 使用我们的转换流,将 FilelnputStream -> InputStreamReader[可以指定编码> BufferedReader ..
//public class Homework02 {
// public static void main(String[] args) {
// String path = "e:\\abc.txt";
// String line = "";
// int i = 1;
// BufferedReader bufferedReader1 = null;
// InputStreamReader inputStreamReader = null;
//
// try {
// inputStreamReader= new InputStreamReader(new FileInputStream(path),"gbk");
// bufferedReader1 = new BufferedReader(inputStreamReader);
//
// //bufferedReader = new BufferedReader(new FileReader(path));
// while ((line = bufferedReader1.readLine()) != null) {
// System.out.println((i++) + "\t" + line);
// }
// } catch (IOException e) {
// throw new RuntimeException(e);
// } finally {
// try {
// if (bufferedReader1 != null) {
// bufferedReader1.close();
// }
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// }
// }
//}
第三题
代码演示:
要求:
(1) 要编写一个dog.properties
name=tom
age=5
color=red
(2) 编写Dog 类(name,age,color) 创建一个dog对象,读取dog.properties 用相应的内容完成属性初始化,并输出
(3) 将创建的Dog 对象,序列化到 文件 dog.dat 文件文章来源:https://www.toymoban.com/news/detail-457810.html
本题就是用到我们之前学习到的序列化和反序列,要记住序列化和反序列化的注意事项文章来源地址https://www.toymoban.com/news/detail-457810.html
package com.homework;
import java.io.*;
import java.util.Properties;
/*
(1) 要编写一个dog.properties
name=tom
age=5
color=red
(2) 编写Dog 类(name,age,color) 创建一个dog对象,读取dog.properties 用相应的内容完成属性初始化,并输出
(3) 将创建的Dog 对象,序列化到 文件 dog.dat 文件
*/
public class Homework03 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "e:dog.dat";
Properties properties = new Properties();
Dog dog = new Dog("tom", 5, "red");
properties.setProperty("name", dog.getName());
properties.setProperty("age", dog.getAge() + "");//int 转成 String 在后面加“” 即可
properties.setProperty("color", dog.getColor());
properties.store(new FileOutputStream("src\\dog.properties"), null);
properties.list(System.out);
a(path);
b(path);
}
public static void a(String path) throws IOException {//序列化
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
objectOutputStream.writeObject(new Dog("tom", 5, "red"));
objectOutputStream.close();
System.out.println("序列化保存成功");
}
public static void b(String path) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(path));
Object dog = objectInputStream.readObject();
System.out.println(dog);
objectInputStream.close();
System.out.println("反序列化");
}
}
class Dog implements Serializable {
private String name;
private int age;
private String color;
public Dog(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", color='" + color + '\'' +
'}';
}
}
到了这里,关于IO流的讲解(4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!