前言:java的读写操作是学java开发的必经之路,Java.io包中包括许多类提供许多有关文件的各个方面操作。下面就来总结下java的读写操作。
主要内容如下
- 1.字节流与字符流的区别
- 2.文件操作
- 3文件操作的具体实现
- 4.实战:解锁功能
一. 字节流与字符流的区别:
字节流与字符流主要的区别是他们的的处理方式
字节流是最基本的,采用ASCII编码,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的
但实际中很多的数据是文本,又提出了字符流的概念,采用Unicode编码.它是按虚拟机的encode来处理,也就是要进行字符集的转化
这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联
字节流 InputStream 输入 OutputStream 输出
字符流 Reader 输入 Writer 输出
其它的类都是继承这四个基本类的!
二:文件操作的一些总结:
1 输入输出抽象基类InputStream/OutputStream ,实现文件内容操作的基本功能函数read()、 write()、close()、skip()等;一般都是创建出其派生类对象(完成指定的特殊功能)来实现文件读写。在文件读写的编程过程中主要应该注意异常处理的技术。
2 FileInputStream/FileOutputStream:
用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象);
本地文件读写编程的基本过程为:
① 生成文件流对象(对文件读操作时应该为FileInputStream类,而文件写应该为FileOutputStream类);
② 调用FileInputStream或FileOutputStream类中的功能函数如read()、write(int b)等)读写文件内容;
③ 关闭文件(close())。
3随机文件读写:
RandomAccessFile类(它直接继承于Object类而非InputStream/OutputStream类),从而可以实现读写文件中任何位置中的数据(只需要改变文件的读写位置的指针)。
随机文件读写编程的基本过程为:
① 生成流对象并且指明读写类型;
② 移动读写位置;
③ 读写文件内容;
④ 关闭文件。
三:方法的实现:创建文件、读取文件、关闭文件等
- 创建文件:
使用构造方法,如下:
String path = "C:\Users\Administrator\Desktop\java";
File file = new File(path.concat.("/text.txt"));
if(file.exists() == false)
{//不存在就创建
file.createNewFile();
}
2.文件写入字节流
FileOutputString fos = new FileOutString(file);
byte [] text = {'1','2','3','4'};
fos.write(text);
//操作完就要关闭文件
fos.close();
3.读取字节流
FileInputString fis = new FileInString(file);
byte [] name =new byte[12];
int count = fis.read(name) ;
//操作完就要关闭文件
fis.close();
4,文件中写入字符流
FileWriter fw = new FileWriter(file);
char [] name = {'java' ,'开'',发'};
fw.write(name);
fw.close();
5.读取字符流
FileReader fr= new FileReader(file);
char [] book = new char[4];
fr.close();
6.将文件作为输入对象:
import java.io.File;
import java.util.Scanner;
public class MyClass {
public static void main(String[] args) throws Exception {
File p = new File("C:\\Users\\Administrator\\Desktop\\java\\java\\java1\\src\\main\\java\\day8\\xt.txt");
Scanner console = new Scanner(p);
while (console.hasNext()){
String input = console.next();
System.out.println(input);
}
console.close();
}
运行结果:
xt.txt中的内容:
四:练习 实现密码解锁功能
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOperation {
public static final String PATH= "C:\\Users\\Administrator\\Desktop\\java\\java\\java1\\src\\main\\java\\day8\\Demo1/pwd.txt";
String password;
//单例模式
public static final FileOperation instance = new FileOperation();
private FileOperation(){
try {
load();
}catch (IOException e){
System.out.println("io 异常");
}
}
public void load() throws IOException {
FileInputStream fis = new FileInputStream(PATH);
byte[] pwd = new byte[4];
int count = fis.read(pwd);
if (count == -1){
password = null;
}else{
password = new String(pwd);
}
fis.close();
}
public void save(String password){
try {
FileOutputStream fos = new FileOutputStream(PATH);
fos.write(password.getBytes());
fos.close();
} catch (IOException e){
System.out.println("io异常");
}
}
}
import java.util.Scanner;
public class MyClass {
public static void main(String[] args){
boolean logined =false;
//判断是否已经登录
String password = FileOperation.instance.password;
if (password != null){
logined = true;
}
//提示用户操作
String alert;
if (logined) {
alert = "请输入密码";
} else {
alert = "请设置密码";
}
System.out.println(alert);
String firt = null;
int wrongTime = 3;
while (wrongTime > 0) {
//接收用户输入
Scanner scanner = new Scanner(System.in);
String inputPassword = scanner.next();
//判断操作
if (logined) {
//已经登陆过 直接比较
if (password.equals(inputPassword)) {
System.out.println("解锁成功");
break;
} else {
System.out.println("解锁失败 请重新输入");
wrongTime--;
}
}else{
//没有登陆过 在设置密码
//判断是设置密码的第一次还是第二次
if (firt == null){
//第一次 保存第一次输入的密码
firt = inputPassword;
System.out.println("请确认密码 ");
}else{
//第二次 比较两次输入的密码是否相同
if (firt.equals(inputPassword)){
System.out.println("设置密码成功");
//保存设置的密码
FileOperation.instance.save(firt);
break;
}else{
System.out.println("两次密码不一致 请重新设置密码:");
firt = null;
wrongTime--;
}
}
}
scanner.nextLine();
}
}
}
创建删除文件
tring content = "Hello World";
// 第一种方法:根据文件路径和文件名
String path = "F:\\test";
String filename = "test.txt";
File myFile = new File(path,filename);
// 第二种方法
String file = "F:\\test\\test.txt";
File myFile = new File(file);
if (!myFile.exists()) {
// 创建文件(前提是目录已存在,若不在,需新建目录即文件夹)
myFile.createNewFile();
// 删除文件
myFile.delete();
}
写入文件
// 第一种:字节流FileOutputStream
FileOutputStream fop = new FileOutputStream(myFile);
byte[] contentInBytes = content.getBytes();
fop.write(contentInBytes);
fop.flush();
fop.close();
// 第二种:FileWriter(参数true为追加内容,若无则是覆盖内容)
FileWriter fw = new FileWriter(myFile,true);
fw.write(content);
fw.close();
// 第三种:BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter(myFile,true));
bw.write(content);
bw.flush();
bw.close();
// 第四种:打印流PrintStream和PrintWriter
// 字节打印流:PrintStream
// 字符打印流:PrintWriter
PrintWriter pw = new PrintWriter(new FileWriter(myFile,true));
pw.println(content); // 换行
pw.print(content); // 不换行
pw.close();
// 常用BufferedWriter和PrintWriter
读取文件
FileInputStream
// 第一种:以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
InputStream in = new FileInputStream(myFile);
// 一次读一个字节
int tempbyte;
while ((tempbyte = in.read()) != -1) {
System.out.write(tempbyte);
}
in.close();
// 一次读多个字节
int byteread = 0;
byte[] tempbytes = new byte[100];
ReadFromFile.showAvailableBytes(in);
while ((byteread = in.read(tempbytes)) != -1) {
S ystem.out.write(tempbytes, 0, byteread);
}
// System.out.write()方法是字符流,System.out.println()方法是字节流
InputStreamReader
// 第二种:以字符为单位读取文件,常用于读文本,数字等类型的文件
Reader reader = new InputStreamReader(new FileInputStream(myFile));
// 一次读一个字节
int tempchar;
while ((tempchar = reader.read()) != -1) {
// 对于windows下,\r\n这两个字符在一起时,表示一个换行。
// 但如果这两个字符分开显示时,会换两次行。
// 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
if (((char) tempchar) != '\r') {
System.out.print((char) tempchar);
}
}
reader.close();
// 一次读多个字节
char[] tempchars = new char[30];
int charread = 0;
// 读入多个字符到字符数组中,charread为一次读取字符数
while ((charread = reader.read(tempchars)) != -1) {
// 同样屏蔽掉\r不显示
if ((charread == tempchars.length) && (tempchars[tempchars.length - 1] != '\r')) {
System.out.print(tempchars);
} else {
for (int i = 0; i < charread; i++) {
if (tempchars[i] == '\r') {
continue;
} else {
System.out.print(tempchars[i]);
}
}
}
}
BufferedReader
// 第三种:以行为单位读取文件,常用于读面向行的格式化文件
BufferedReader reader = new BufferedReader(new FileReader (myFile));
String tempString = null;
int line = 1;
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
// 显示行号
System.out.println("line " + line + ": " + tempString);
line++;
}
reader.close();
// 常用BufferedReader
文件函数
//判断文件是否存在
myFile.exists()
//读取文件名称
myFile.getName()
//读取文件路径(相对路径)
myFile.getPath()
//读取文件绝对路径
myFile.getAbsolutePath()
//读取文件的父级路径
new File(myFile.getAbsolutePath()).getParent()
//读取文件的大小
myFile.length()
//判断文件是否被隐藏
myFile.isHidden()
//判断文件是否可读
myFile.canRead()
//判断文件是否可写
myFile.canWrite()
//判断文件是否为文件夹
myFile.isDirectory()
这个练习相比而言比较简单,答案我就不公布,希望大家不忘初心,每天跟着脚步走,有时候,在电脑前坐久了,腰酸背痛,在学习的同时不要忘记运动呀各位,身体是革命的本钱呀~~~~~