进程和线程
进程
应用程序的执行实例;有独立的内存空间和系统资源。
线程
CPU调度和分派的基本单位;进程中执行运算的最小单位,可完成一个独立的顺序控制流程。
IO流概述
I表示input,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
O表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。
IO流的分类
File
字节流
字符流
特殊操作流
File
1.1 File类概述和构造方法
File:它是文件目录路径名的抽象表示
文件和目录是可以通过File封装成对象的
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以事不存在的。将来是 要通过具体的操作把这个路径的内容转换为具体存在的
import java.io.File;
public static void main(String[] args) {
// File(String pathname):
// 通过将给定的 路径名字符串 转换为 抽象路径名 来创建新的 File实例。
File f1 = new File("E:\\itcast\\java.text");
System.out.println(f1);
// File(String parent,String child):
// 从 父路径名字符串 和 子路径名字符串 创建新的File实例。
File f2 = new File("E:\\itcast", "java.text");
System.out.println(f2);
// File(File parent,String child):
// 从 父抽象路径名 和 子路径名字符串 创建新的File实例。
File f3 = new File("E:\\itcast");
File f4 = new File(f3, "java.text");
System.out.println(f4);
}
运行结果
1.2 File类创建功能
import java.io.File;
import java.io.IOException;
public static void main(String[] args) throws IOException {
// 需求1:我要在E:\\itcast目录下创建一个文件java.text
File f1 = new File("E:\\itcast\\java.text");
System.out.println(f1.createNewFile());
// 需求2:我要在E\\:itcast目录下创建一个目录JavaSE
File f2 = new File("E:\\itcast\\JavaSE");
System.out.println(f2.mkdir());
// 需求3:我要在E:\\itcast目录下创建一个多级目录JavaWEB\\HTML
File f3 = new File("E:\\itcast\\javaWEB\\HTML");
//System.out.println(f3.mkdir());
System.out.println(f3.mkdirs());
// 需求4:我要在E:\\itcast目录下创建一个文件Javase.text
File f4 = new File("E:\\itcast\\javase.text");
System.out.println(f4.mkdir());
}
1.3 File类删除功能
import java.io.File;
import java.io.IOException;
public static void main(String[] args) throws IOException {
// File f1 = new File("E:\\itcast\\java.txt");
//需要1:在当前模块目录下创建java.txt文件
File f1 = new File("黑马程序员\\java.txt");
// System.out.println(f1.createNewFile());
//需要2:删除当前模块目录下的java.txt文件
System.out.println(f1.delete());
System.out.println("-----------");
//需要3:在当前模块目录下创建itcast目录
File f2 = new File("黑马程序员\\itcast");
System.out.println();
//需求4:删除当前模块目录下的itcast目录
System.out.println();
}
1.4 File类判断和获取功能
import java.io.File;
public static void main(String[] args) {
// 创建一个File对象
File f = new File("黑马程序员\\java.txt");
// public boolean isDirectory():测试此 抽象路径名 表示的File 是否为 目录
// public boolean isFile():测试此 抽象路径名 表示的File 是否为 文件
// public boolean exists():测试此 抽象路径名 表示的File 是否 存在
System.out.println(f.isDirectory());
System.out.println(f.isFile());
System.out.println(f.exists());
// public String getAbsolutePath():返回此 抽象路径名 的 绝对路径名字符串
// public String getPath():将此 抽象路径名 转换为 路径名字符串
// public String getName():返回由此 抽象路径名 表示的 文件或目录的名称
System.out.println(f.getAbsolutePath());
System.out.println(f.getPath());
System.out.println(f.getName());
// public String[] list():返回此 抽象路径名 表示的 目录中的文件和目录的名称 字符串数组
// public File[] listFiles():返回此 抽象路径名 表示的 目录中的文件和目录的File对象 数组
File f2 = new File("E:\\itcast");
String[] strArray = f2.list();
for (String str : strArray) {
System.out.println(str);
}
System.out.println("------------");
File[] fileArray = f2.listFiles();
for (File file : fileArray) {
// System.out.println(file);
// System.out.println(file.getName());
if (file.isFile()) {
System.out.println(file.getName());
}
}
}
字节流
2.1 IO流概述和分类
IO流概述:
- IO:输入/输出(Input/Output)
- 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流 ,流的本质是数据传输
- IO流就是用来处理设备间数据传输问题的
常见的应用:文件复制;文件上传;文件下载
IO流分类:
按照数据的流向
- 输入流:读数据
- 输出流:写数据
按照数据类型来分
- 字节流:字节输入流;字节输出流
- 字符流:字符输入流;字符输出流
- 一般来说,我们说IO流的分类是按照数据类型来分的
那么这两种流都在什么情况下使用呢?
- 如果数据通过Window自带的记事本软件打开,我们可以读懂里面的内容,就使用字符流。否则使用字节流。如果不知道该使用哪种类型的流,就使用字节流。
2.2 字节流写数据
字节流抽象基类
- InputStream:这个抽象类是表示字节输入流的所有类的超类
- OutputStream:这个抽象类是表示字节输出流的所有类的超类
- 子类名特点:子类名都是以其父类名作为子类名的后缀
FileOutpotStream:文件输出流用于将数据写入File
- FileOutputStream(String name):创建文件输出流以指定的名称写入文件
- FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件
使用字节输出流写数据的步骤:
- 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
void write(int b) | 将指定的字节写入此文件输出流 |
void close() | 关闭此文件输出流并释放与此流相关联的任何系统资源。 |
import java.io.FileOutputStream;
import java.io.IOException;
public static void main(String[] args) throws IOException {
//创建字节输出流对象
//FileOutputStream(String name):创建文件输出流以指定的名称写入文件
FileOutputStream fos = new FileOutputStream("D:\\java_\\黑马程序员\\fos.txt");
/*
字节输出流做了三件事情
调用系统功能创建了文件
创建了字节输出流对象
让字节输出流对象指向创建好的文件
*/
// void write(int b):将指定的字节写入此文件输出流
fos.write(97);
// fos.write(57);
// fos.write(55);
// void close();关闭此文件输出流并释放与此流相关联的任何系统资源。
fos.close();
}
2.3 字节流写数据的三种方式
byte[] getBytes() | 返回字符串对应的字节数组 |
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/*
构造方法:
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件
写数据的三种方式:
write(int b):将指定的字节写入此文件输出流
一次写一个字节数据
write(byte[] b):将b.length字节从指定的字节数组写入此文件输出流
一次写一个字节数组数据
write(byte[] b, int off, int len):将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流
一次写一个字节数组的部分数据
*/
public class b10_字节流写输入的三种方式 {
public static void main(String[] args) throws IOException {
// FileOutputStream(String name):创建文件输出流以指定的名称写入文件 从内存到磁盘
FileOutputStream fos = new FileOutputStream("D:\\java_\\黑马程序员\\fos.txt");
FileOutputStream fos1 = new FileOutputStream(new File("D:\\java_\\黑马程序员\\fos1.txt"));
//FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件
File file = new File("D:\\java_\\黑马程序员\\file.txt");
FileOutputStream fos2 = new FileOutputStream(file);
//void write(int b):将指定的字节写如此文件输出流
fos.write(97);
fos.write(98);
fos.write(99);
fos.write(100);
fos.write(101);
//void write(byte[] b): 将b.length字节从指定的字节数组写入此文件输出流
byte[] bytes = {97, 98, 99, 100, 101, 102};
fos.write(bytes);
//byte[] getBytes():返回字符串对应的字节数组
byte[] bytes1 = "cuishunmeng".getBytes();
fos.write(bytes1);
//write(byte[] b, int off, int len):将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流
fos.write(bytes1,2,2);
//释放资源
fos.close();
}
}
2.4 字节流写数据的两个小问题
字节流写数据如何实现换行呢?
- 写完数据后,加换行符
- window:\r\n
- linux:\n
- mac:\r
字节流写数据如何实现追加写入呢?
- public FileOutputStream(String name, boolean append)
- 创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头
2.5 字节流写数据加异常处理
finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源
特点:被finally控制的语句一定会执行,除非JVM退出
2.6 字节流读数据(一次多一个字节数据)
需求:把文件fos.txt中的内容读取出来在控制台输出
FileInputStream:从文件系统中的文件获取输入字节
FileInputStream(String name):通过打开与实际文件的链接来创建一个FileInputStream,该文件由文件系统中的路径名name命名
使用字节输入流读数据的步骤:
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
int read() | 从该输入流读取一个字节的数据 |
import java.io.FileInputStream;
import java.io.IOException;
public class b13_字节流读数据_一次读一个字节数据 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("D:\\java_\\黑马程序员\\fos.txt");
//调用字节输入流对象的读数据方法
//int read():从该输入流读取一个字节的数据
// //第一次读取数据
// int by = fis.read();
// System.out.println(by);
// System.out.println((char) by);
//
// //第二次读取数据
// by = fis.read();
// System.out.println(by);
// System.out.println((char) by);
//
// //在多读取两次
// by = fis.read();
// System.out.println(by);
// by = fis.read();
// System.out.println(by); //如果到达文件的末尾,输出: —a
// //循环输出
// int by = fis.read();
// while (by != -1) {
// System.out.println(by);
// System.out.println((char) by);
// by = fis.read();
// }
//优化循环
int by;
/*
fis.read():读数据
by = fis.read():把读取到的数据赋值给by
by != -1:判断读取到的数据是否是-1
*/
while ((by = fis.read()) != -1) {
System.out.print((char) by);
}
//优化
//释放资源
fis.close();
}
}
2.7 字节流复制文本文件
字符流
3.1
3.2
3.3 字符串中的编码解码问题
编码:
byte[] getBytes():使用平台默认的字符集将该String编码为一系列字节,结果存储到新的字节数组中
byte[]
解码: