先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:xhs1999xhs (备注Java)
正文
文章目录
前言
在计算机中,通常使用各种各样的文件来保存数据,如何在Java程序中操作这些文件呢?java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。首先学习使用File类操作文件和目录。
File
- File对象可以表示文件或目录,程序中一个File对象可以代表一个文件或目录。可以利用他对文件或目录进行基本操作。如查看名称、最后修改日期、文件大小等。
- File类构造方法:
方法 | 说明 |
---|---|
File(String pathname) | 用指定文件路径构造文件 |
File(String dir,String subpath) | 指定文件路径下创建指定文件名的文件 |
File(File parent,String subpath) | 指定文件对象中创建指定文件名文件 |
- File类常见方法
方法 | 说明 |
---|---|
boolean exists() | 文件是否存在,存在返回true |
String getAbsolutePath() | 返回此对象表示的文件的绝对路径名 |
String getName() | 返回吃对象表示的文件的名称 |
String getParent() | 返回此File对象的路径名的上一级,没有则返回null |
boolean delete() | 删除此对象指定的文件 |
boolean isDirectory() | 是否是目录 |
boolean mkdir() | 创建目录,路径由当前File对象指定 |
boolean mkdirs() | 创建包括父目录的目录 |
代码示例:
public static void main(String[] args) throws IOException {
//构造文件对象
File file=new File("C:/Users/29616/desktop/1.txt");
//判断是否存在
if(file.exists()){
//存在,判断是否是文件
if(file.isFile()){
System.out.println("文件存在");
//定义str字符串
String str="好好学习,天天向上\t";
//字符流 写入 true表示向文件追加内容 false表示覆盖
FileWriter fw=new FileWriter("C:/Users/29616/desktop/1.txt",true);
//写入
fw.write(str);
//关比字符流,不关闭会导致长期占用资源,并且安全性低
fw.close();
//字符流 读取
FileReader fr=new FileReader("C:/Users/29616/desktop/1.txt");
//定义一个字符数组,用于存储读到字符
char[] datas=new char[1024];
//把读取的内容存到数组里,读到的是字符个数
fr.read(datas);
System.out.println(datas);
fr.close();
//文件大小
long length=file.length();
System.out.println(length);
//文件路径
String path=file.getPath();
System.out.println(path);
//文件绝对路径
String abspath=file.getAbsolutePath();
System.out.println(abspath);
//最后修改时间
long time=file.lastModified();
//System.out.println(time);
//格式化时间
Date date=new Date(time);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(date));
//删除文件
if(file.delete()){
System.out.println("删除成功");
}
//不是文件
}else{
System.out.println("文件夹");
}
}else{
//文件不存在
System.out.println("不存在,创建");
//创建新文件
file.createNewFile();
System.out.println("创建成功" );
}
}
Java流
前面讲解的java.io包中的File类对文件或目录的属性进行操作,但File类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据。下面介绍文件的读写操作。
读文件是指把文件中的数据读取到内容中,反之,写文件是指把内存中的数据写入到文件中。通过“流”可以实现读写文件的操作。
流的分类
数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。
- 按照流的方向主要分为输入流和输出流两大类。
- 数据流按照数据单位的不同分为字节流和字符流。
- 按照功能可以划分为节点流和处理流。
1.输入流和输出流
输入/输出流是相对于计算机内存来说的,输入流表示数据输入到内存,输出流表示从内存中输出。Java的输出流主要由OutputStream和Write作为基类,输入流由InputStream和Reader作为基类。
#mermaid-svg-Bsw0UeMpFs86YdXX {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .error-icon{fill:#552222;}#mermaid-svg-Bsw0UeMpFs86YdXX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Bsw0UeMpFs86YdXX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Bsw0UeMpFs86YdXX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Bsw0UeMpFs86YdXX .marker.cross{stroke:#333333;}#mermaid-svg-Bsw0UeMpFs86YdXX svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Bsw0UeMpFs86YdXX .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster-label text{fill:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster-label span{color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .label text,#mermaid-svg-Bsw0UeMpFs86YdXX span{fill:#333;color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .node rect,#mermaid-svg-Bsw0UeMpFs86YdXX .node circle,#mermaid-svg-Bsw0UeMpFs86YdXX .node ellipse,#mermaid-svg-Bsw0UeMpFs86YdXX .node polygon,#mermaid-svg-Bsw0UeMpFs86YdXX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Bsw0UeMpFs86YdXX .node .label{text-align:center;}#mermaid-svg-Bsw0UeMpFs86YdXX .node.clickable{cursor:pointer;}#mermaid-svg-Bsw0UeMpFs86YdXX .arrowheadPath{fill:#333333;}#mermaid-svg-Bsw0UeMpFs86YdXX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Bsw0UeMpFs86YdXX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Bsw0UeMpFs86YdXX .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Bsw0UeMpFs86YdXX .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster text{fill:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX .cluster span{color:#333;}#mermaid-svg-Bsw0UeMpFs86YdXX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Bsw0UeMpFs86YdXX :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
按流向区分
输出流
输出流
OutputStream和Write作为基类
InputStream和Reader作为基类
输入输出流
2.字节流和字符流
输入/输出流又按照处理数据单元的不同分为字节流和字符流。
字节流是8位通用字节流,其基本单位是字节,字节流的基类是InputStream类(常用子类FileInputStream)和OutPutStream类(常用子类FileOutputStream),他们是抽象类。
字符流是16位Unicode字符流,基本单位是Unicode字符。字符流最适合用来处理字符串和文本,支持国际上大多数的字符集和语言。字符流的基类是Reader类(常用子类BufferedReader)和Writee(常用子类BufferedWriter)类,也是抽象类。
注:所有方法再出现错误时,都会抛出IOExcpetion。
#mermaid-svg-FVuAQoiEai5EtIUf {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .error-icon{fill:#552222;}#mermaid-svg-FVuAQoiEai5EtIUf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FVuAQoiEai5EtIUf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FVuAQoiEai5EtIUf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FVuAQoiEai5EtIUf .marker.cross{stroke:#333333;}#mermaid-svg-FVuAQoiEai5EtIUf svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FVuAQoiEai5EtIUf .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster-label text{fill:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster-label span{color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .label text,#mermaid-svg-FVuAQoiEai5EtIUf span{fill:#333;color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .node rect,#mermaid-svg-FVuAQoiEai5EtIUf .node circle,#mermaid-svg-FVuAQoiEai5EtIUf .node ellipse,#mermaid-svg-FVuAQoiEai5EtIUf .node polygon,#mermaid-svg-FVuAQoiEai5EtIUf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FVuAQoiEai5EtIUf .node .label{text-align:center;}#mermaid-svg-FVuAQoiEai5EtIUf .node.clickable{cursor:pointer;}#mermaid-svg-FVuAQoiEai5EtIUf .arrowheadPath{fill:#333333;}#mermaid-svg-FVuAQoiEai5EtIUf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FVuAQoiEai5EtIUf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FVuAQoiEai5EtIUf .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-FVuAQoiEai5EtIUf .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster text{fill:#333;}#mermaid-svg-FVuAQoiEai5EtIUf .cluster span{color:#333;}#mermaid-svg-FVuAQoiEai5EtIUf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FVuAQoiEai5EtIUf :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
按处理数据单元划分
字节流
字符流
字节输入流InputStream作为基类
字节输入流OutputStream作为基类
字符输入流Reader作为基类
字符输出流Writer作为基类
字节流与字符流
读写文本文件
1.使用字节流读写文本文件
- 使用字节流FileInputStream读文本文件
package exam;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest {
/\*\*
\* 字节流读文件
\* @param args
\* @throws IOException
\*/
public static void main(String[] args) throws IOException {
File file=new File("C:/Users/29616/desktop/1.txt");
//创建流对象
FileInputStream fis=new FileInputStream(file);
int data;
System.out.println("可读取的字节数:"+fis.available());
System.out.println("文件内容为:");
//循环读数据
while ((data=fis.read())!=-1){
System.out.println(data+"");
}
fis.close();
}
}
- 使用字字节流FileOutputStream写文本文件
package exam;
import java.io.FileOutputStream;
import java.io.IOException;
/\*\*
\* 字节流写文件
\*/
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
try{
String str="java";
byte[] b=str.getBytes();//字节数组
FileOutputStream fos=new FileOutputStream("C:/Users/29616/desktop/1.txt",true);
fos.write(b,0,b.length);
System.out.println("文件已更新");
fos.flush();
fos.close();
}catch (IOException obj){
System.out.println("创建文件时出错");
}
}
}
2.使用字符流读写文本文件
- 使用字符流BufferedReander和FileReader读文本文件
package exam;
import java.io.\*;
/\*\*
\* 字符流读文件
\*/
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
File file=new File("C:/Users/29616/desktop/1.txt");
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
String line=br.readLine();
while(line!=null){
System.out.println(line);
line=br.readLine();
}
br.close();
fr.close();
}
}
- 使用字符流BufferedWriter和FileWriter写文本文件
package exam;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/\*\*
\* 字符流写文件
\*/
public class BufferedWriterTest {
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter("C:/Users/29616/desktop/1.txt",true));
bw.write("java");
bw.newLine();
System.out.println("写入成功!");
bw.flush();
bw.close();
}
}
读写二进制文件
读写二进制文件常用的类有DataInputStream和DataOutputStream。
代码示例:
package exam;
import java.io.\*;
/\*\*
\* 读取二进制文件1.class中数据,复制到另一个二进制文件2.class文件中
\*/
public class ReadAndWriteClass {
public static void main(String[] args) throws IOException {
File file=new File("C:/Users/29616/desktop/1.class");
File copyfile=new File("C:/Users/29616/desktop/2.class");
file.createNewFile();
copyfile.createNewFile();
//字节流读文件
FileInputStream fis=new FileInputStream(file);
//字节流读二进制文件
DataInputStream dis=new DataInputStream(fis);
//字节流写文件
FileOutputStream fos=new FileOutputStream(copyfile,true);
//字节流写二进制文件
DataOutputStream dos=new DataOutputStream(fos);
int temp;
while ((temp=dis.read())!=-1){ //读数据
dos.write(temp); //把读取数据写入到2.clss中
}
System.out.println("读写成功");
fis.close();
fos.close();
dis.close();
dos.close();
}
}
重定向标准I/O
Java提供了两个标准输入/输出流:System.in和System.out,主要用于从键盘接受数据以及向屏幕输出数据。
使用重定向标准I/O可以使用System.in读取文件中的数据以及使用System.out向文件中写入数据。
System类提供3个重定向标准I/O的方法:
方法 | 说明 |
---|---|
static void setErr(PrintStream err) | 重定向标准错误输出流 |
static void setIn(InputStream in) | 重定向标准输入流 |
static void setOut(PrintStream out) | 重定向标准输出流 |
代码示例:
package demo1;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Test3 {
public static void main(String[] args) {
//创建PrintStream输入流
try {
PrintStream ps=new PrintStream(new FileOutputStream("C:/Users/29616/desktop/1.txt"));
//将标准输出流重定向到文件
System.setOut(ps);
//向文件中输出内容
System.out.print("重定向测试");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
}
}
}
读者福利
由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴
更多笔记分享
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs(备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ew PrintStream(new FileOutputStream(“C:/Users/29616/desktop/1.txt”));
//将标准输出流重定向到文件
System.setOut(ps);
//向文件中输出内容
System.out.print(“重定向测试”);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
}
}
}
# **读者福利**
**由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴**
[外链图片转存中...(img-pnniX2on-1713614053401)]
[外链图片转存中...(img-gQAVJC4g-1713614053402)]
[外链图片转存中...(img-xVGIjbUu-1713614053402)]
**更多笔记分享**
[外链图片转存中...(img-vFQ4sRKk-1713614053403)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs(备注Java)**
[外链图片转存中...(img-Sw38XVcc-1713614053403)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**