Java学习47-Java 流(Stream)、文件(File)和IO - 其他流的使用

1.标准输入流System.in/标准输出流System.out
System.in : 标准的输入流,默认从键盘输入
System.out: 标准的输出流,默认从显示器输出(理解为控制台输出)

System.setOut()方法和 System.setIn()方法(结合下面介绍的打印流举例)

2.打印流
实现将基本数据类型的数据格式转化为字符串输出。
打印流:PrintStream 和 PrintWriter

如果并不想从键盘输入,也不想从显示器读出,换言之,比如想要
“从一个文件A读取信息,进行处理后再将信息写入一个文件B”
可以通过调用如下的方法,修改输入流和输出流的位置:

  • 将信息输入内存 格式为setIn(InputStream in)

举个例子,比如 setIn(InputStream is)表示输入的data来源是InputStream类型名叫is的对象,而不是传统思维上的键盘。

  • 将信息从内存抛出 格式为setOut(PrintStream out)

举例一,比如 setOut(PrintStream ps)表示输出的data去了PrintStream类型名叫ps的对象,而不是传统思维上的屏幕。

举例二,比如创建一个新的PrintStream对象,它将输出写入到文件out.txt
FileOutputStream fos = new FileOutputStream(“out.txt”);
System.setOut(new PrintStream(fos));

可以用下面这句话重新恢复默认输出流
System.setOut(System.out);

示例:使用 System.setOut() 将输出数据写进一个具体的文件。

import java.io.*;public class PrintIO {public static void main(String[] args) {try {// 创建一个新的 PrintStream 对象,它将输出写入到文件FileOutputStream fos = new FileOutputStream("output666.txt");System.setOut(new PrintStream(fos));// 现在,System.out.println() 的输出将写入到 output666.txt 文件中System.out.println("哈哈!This will be written to output666.txt");} catch (IOException e) {e.printStackTrace();} finally {// 恢复原始的标准输出流(可选)System.setOut(System.out);}}}

运行完毕,系统生成了一个文件,叫做 output666.txt,并且往文件里填充了一句话

哈哈!This will be written to output666.txt"

System.setOut在段落中出现的具体行数其实不太影响写入的文件内容,注意一旦遇见ps.close()也就是PrintStream.close()关闭了想要写入的那个文件,那么在这一行之后出现的data就真的写不进去了。

  • 示例1
    将几行data写入一个固定的文件,注意观察,文件close再想写入语句,写不进去了。System.setOut(ps)在程序中的位置,无法调控写入或者不写本行data。

package IOTest;import org.junit.Test;import java.io.*;public class PrintIO {@Testpublic void PrintStream1() throws FileNotFoundException {//public static void main(String[] args) throws FileNotFoundException {PrintStream ps = new PrintStream("io.txt");ps.println("hello, how are you?");ps.println(666);ps.println(1.5);System.setOut(ps);System.out.println("!“£¥%……&*(");System.out.println("我是写在setOut后面的句子");//写在setOut后面的句子并不影响输入进文件,但是close后面的就不会再进入文件了ps.close();ps.println("hi this is Polly");//ps.close()后面添加的的语句是不会被写进文件的}}

下面是写好的io.txt文件内容:

hello, how are you?
666
1.5
!“£¥%……&*(
我是写在setOut后面的句子
  • 示例2 使用PrintStream向一个文件内写入自动数据,要求写入0-255,每到50就换行
    程序示例
package IOTest;import org.junit.Test;import java.io.*;public class PrintIO {@Test public void test2() throws FileNotFoundException {FileOutputStream fos = new FileOutputStream(new File("printIOtest.txt"));PrintStream ps= new PrintStream(fos,true);//true表示自动刷新if(ps != null){System.setOut(ps);}for (int i = 0; i < 255; i++) { //输出0-255可以是数字或者是字符//System.out.print((char) i);//也可用来输出ASCII字符System.out.print(i+"\t");//输出数字if(i%50 ==0){System.out.println(); //每50个换行}}ps.close();}}

程序输出显示每到50一换行:

0	
1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16	17	18	19	20	21	22	23	24	25	26	27	28	29	30	31	32	33	34	35	36	37	38	39	40	41	42	43	44	45	46	47	48	49	50	
51	52	53	54	55	56	57	58	59	60	61	62	63	64	65	66	67	68	69	70	71	72	73	74	75	76	77	78	79	80	81	82	83	84	85	86	87	88	89	90	91	92	93	94	95	96	97	98	99	100	
101	102	103	104	105	106	107	108	109	110	111	112	113	114	115	116	117	118	119	120	121	122	123	124	125	126	127	128	129	130	131	132	133	134	135	136	137	138	139	140	141	142	143	144	145	146	147	148	149	150	
151	152	153	154	155	156	157	158	159	160	161	162	163	164	165	166	167	168	169	170	171	172	173	174	175	176	177	178	179	180	181	182	183	184	185	186	187	188	189	190	191	192	193	194	195	196	197	198	199	200	
201	202	203	204	205	206	207	208	209	210	211	212	213	214	215	216	217	218	219	220	221	222	223	224	225	226	227	228	229	230	231	232	233	234	235	236	237	238	239	240	241	242	243	244	245	246	247	248	249	250	
251	252	253	254	

example 3: 创建一个打印流,这个打印流会向规定的文件输入一些log,这些log显示了当前的时间和一些其他文本,由程序员自定义。

参考程序

package IOTest;import org.junit.Test;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;public class Logger {public static void log(String msg) throws FileNotFoundException {//建立一个准备写入的文件,准备好打印流//FileOutputStream fos = new FileOutputStream(new File("log666.txt"),true); //写法1:true表示data不覆盖,直接自动向后添加FileOutputStream fos = new FileOutputStream("log666.txt",true); //写法2:true表示保留原有data,直接向后继续添加PrintStream ps= new PrintStream(fos,true); //自动刷新//为准备好的打印流提供输出方向(准备好的那个file)System.setOut(ps);//写法3 将前面的三行合成两行,实现功能是一模一样的// PrintStream ps = new PrintStream(new FileOutputStream("log666.txt",true));//System.setOut(ps);//准备写入文件的内容:Date nowTime = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String strTime = sdf.format(nowTime);System.out.println(strTime+": "+msg);ps.close();}
}

对上面的方法进行调用,主程序如下:

package IOTest;import org.junit.Test;import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;public class PrintIO {@Testpublic void test_log() throws FileNotFoundException {Logger.log("this is log message 1");Logger.log("this is log message 2");Logger.log("this is log message 3");
}}

生成的文档文件名为log666.txt,内容如下:

2024-05-12 16:20:21: this is log message 3
2024-05-12 16:21:58: this is log message 1
2024-05-12 16:21:59: this is log message 2
2024-05-12 16:21:59: this is log message 3

知识补充 - native关键字

使用native关键字声明的特殊方法在Java代码中并没有具体的实现,而是由其他语言(如C、C++)实现的,并通过Java Native Interface (JNI) 与Java虚拟机(JVM)进行交互。
  • 综合练习:从键盘输入字符,要求将读取到的整行字符串转成大写输出,然后进行输出操作。直至当输入“e”或者“exit”时候停止
package IOTest;import java.io.*;
import java.util.Scanner;public class UpperCaseConv {//从键盘输入字符,要求将读取到的整行字符串转成大写输出,然后进行输出操作。//直至当输入“e”或者“exit”时候停止//方法一:public static void main(String[] args) {System.out.println("pls enter any Strings want to conv into UpperCase(e or exit to stop): ");Scanner x = new Scanner(System.in);String str1;while ((str1 = x.next())!= null) {{System.out.println("to Upper case:  " + str1.toUpperCase());if (str1.endsWith("e") || str1.endsWith("exit")) {System.out.println("final results: " + str1.toUpperCase());System.out.println("------->");break;}}}}
}// 方法二
/*
*
*public static void main(String[] args) throws IOException {System.out.println("请输入信息(退出输入e或者exit):");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s;while((s=br.readLine())!= null){if(s.equals('e') || s.equals("exit") ){break;}System.out.println("--->"+s.toUpperCase());System.out.println("请继续输入:");}}
}
*
*
*
* */

方法一输出显示:

pls enter any Strings want to conv into UpperCase(e or exit to stop): 
ok
to Upper case:  OK
good
to Upper case:  GOOD
fine
to Upper case:  FINE
final results:FINE
------->Process finished with exit code 0

方法二输出显示:

请输入信息(退出输入e或者exit):
haha
--->HAHA
请继续输入:
yes
--->YES
请继续输入:
fine
--->FINE
请继续输入:
exitProcess finished with exit code 0

总结:对于从键盘上输入信息,可以使用下面的代码完成和Scanner一样的功能:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();

从键盘上读取用户输入的信息。对应的Scanner获取键盘输入内容的程序如下:

  Scanner x = new Scanner(System.in);String str = x.next();System.out.println(str);
  • 练习:Create a program nemaed MyInput java: Contain the methods for reading int, double,float,boolean,short,byte and String values from the keyboard.

参考程序

package IOTest;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;public class Def_Scan {//Create a program nemaed MyInput java:// Contain the methods for reading int, double,float,boolean,short,byte and String values from the keyboard.//方式一:/***public static void main(String[] args) {Scanner x = new Scanner(System.in);String str = x.next();System.out.println(str);}
}** *///方式2:public static void main(String[] args) throws IOException {System.out.println(readString());System.out.println(readInt());System.out.println(readDouble());System.out.println(readFloat());System.out.println(readBoolean());System.out.println(readByte());System.out.println(readShort());}public static String readString() {System.out.println("请输入:");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str = "";try {str = br.readLine();} catch (IOException e) {//throw new RuntimeExceptionSystem.out.println(e);}return str;}public static int readInt() throws IOException {return Integer.parseInt(readString());}public static double readDouble() throws IOException {return Double.parseDouble(readString());}public static float readFloat() throws IOException {return Float.parseFloat(readString());}public static boolean readBoolean() throws IOException {return Boolean.parseBoolean(readString());}public static byte readByte() throws IOException {return Byte.parseByte(readString());}public static short readShort() throws IOException {return Short.parseShort(readString());}}

复习 Scanner

从键盘上输入一些数据,自动写进文件里:

参考程序(注意这个程序不能用import org.junit.Test;建立的@Test来测试,结果会不正确)

package IOTest;import java.io.*;
import java.util.Scanner;public class TestScanner2 {public static void main(String[] args) throws IOException {Scanner x = new Scanner(System.in);PrintStream ps = new PrintStream(new FileOutputStream("scanner1.txt"));while (true) {System.out.println("请输入:");String str = x.nextLine();//if(str.equals("stop")){if (("stop".equals(str)) || (str.equals("exit"))) {break;}ps.println(str);}System.setOut(ps);// System.setOut(ps);这一句就直接把后续的全部信息输出导向scanner1.txt文件了。// 后面步骤计算得到9,也不会在屏幕显示9,它会把这个9自动写进scanner1.txt文件里//ps.close(); //如果这一步执行了,那么下面的System.out.println(3+6)就不会写入文件了,因为打印流都关闭了x.close();System.out.println(3+6);}}

IDEA控制台console的内容如下:

请输入:
apple
请输入:
pear
请输入:
banana
请输入:
oh lots of yummy food
请输入:
stopProcess finished with exit code 0

scanner1.txt 文档最终内容如下:

apple
pear
banana
oh lots of yummy food
9

举例:从现存文件里读取文件的内容,显示在屏幕上:

package IOTest;import java.io.*;
import java.util.Scanner;public class TestScanner2 {
//从文件读取信息,显示在屏幕上:public static void main(String[] args) throws IOException{Scanner x = new Scanner(new FileInputStream("scanner1.txt"));while(x.hasNextLine()){String str = x.nextLine();System.out.println(str);}x.close();}
}

结果显示:文件包含的内容被正确的读出并显示到了屏幕上。

  1. apache-common包的使用
    IO技术开发中代码量很大且重复,Apache软件基金会开发了IO技术的工具类commonsIO,·简化了IO开发。要使用这种第三方的开发工具,需要添加jar包(由class文件编译后产生)。在导入jar包之后,内部的API都可以使用。

知识点
下载文件的类型选择:

Source Distribution 和 Binary Distribution。Source 是源代码版,需要自己编译成可执行软件。 
Binaries是可执行版,直接下载解压就可以拿来用的,已经编译好了版本。
通常直接下载Binaries中的jar支持包使用即可(本例中,ubuntu系统下载了commons-io-2.16.1-bin.zip然后本地解压,得到了commons-io-2.16.jar文件)。

安装jar包:

尝试安装commons-io-2.5.jar(实际下载的是commons-io-2.16.1-bin.zip文件)

  • 下载地址:
    https://commons.apache.org/proper/commons-io/
    或者
    https://commons.apache.org/io/download_io.cgi
  • 导入包步骤:
    下载包,本例采用文件commons-io-2.16.1-bin.zip(文件解压后里面有jar包)
  1. 第一种方式
    点击IDEA里面的File>Project Structure,在展开的页面,找到Libraries的TAB,然后点击 +
    得到一个页面(选择想要放置jar包的位置)

在这里插入图片描述

系统可能会询问这是什么文件夹(选择这是一个jar包)
在这里插入图片描述

jar包就安装进项目文件里了。

  1. 第二种方式

自建lib
直接Ctrl+V 文件commons-io-2.5.jar

在IDEA左侧Project处下拉的项目工程内,找到当前项目的目录(比如IOTest项目),点击右键新建Package,起名叫做lib(或者libs)。将commons-io-2.6.jar拷贝到刚才新建的lib目录下(copy文件commons-io-2.5.jar 然后再在lib目录处使用Ctrl+V即可)

在这里插入图片描述

在这里插入图片描述

此时jar包已经成功copy进项目,但图标显示两条竖线,无法详细打开jar包具体内容。
在这里插入图片描述

再次在Project下面当前项目处点击右键,选择Add as Library。添加成功后jar包也可以打开。
在这里插入图片描述

添加完成。

jar包的使用举例

举例:IOUtils类的使用,如图所示安装后的jar包可以在项目列表里找到,比如想要使用FileUtils里面的copyFile方法copy一个图片,代码如下:

在这里插入图片描述

import java.io.*;
import org.apache.commons.io.FileUtils;
import org.junit.Test;public class jartest {@Testpublic void test01() throws IOException {File srcFile = new File("test_photo1.jpeg");File desFile = new File("del_copy_test_photo1.jpeg");FileUtils.copyFile(srcFile, desFile);System.out.println("复制完毕");}}

运行结果(图片被成功的copy了):

复制完毕Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701332.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验十 智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 完成以下页面设计。 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; Wxml <view class"container"> <view class"header"> <view class"logo"…

OSEK应用模式

1 前言 应用模式&#xff08;Application modes)用于区分不同的场景&#xff0c;以便在系统运行时&#xff0c;组织各自相互独立的OS相关的资源集合&#xff0c;是一种分而治之的思想体现。不同的应用模式是互斥的&#xff0c;即系统当前必须在一种应用模式&#xff08;且只能在…

StNet: Local and Global Spatial-Temporal Modeling for Action Recognition 论文阅读

StNet: Local and Global Spatial-Temporal Modeling for Action Recognition 论文阅读 Abstract1 Introduction2 Related Work3 Proposed Approach4 Experiments5 Conclusion 文章信息&#xff1a; 原文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/4…

【软考】设计模式之桥接模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.将抽象部分与其实现部分分离&#xff0c;使它们都可以独立地变化。2.桥接模式&#xff08;Bridge Pattern&#xff09;属于对象结构型模式&#xff0c;又称为柄体&#xff08;Handle an…

SpringBoot实现 QQ邮箱验证码

SpringBoot实现 QQ邮箱验证码 文章目录 SpringBoot实现 QQ邮箱验证码一、开通SMTP校验码1.登录qq邮箱2.开启SMTP服务3.发送手机短信4.得到授权码 二、回到spring项目中1.导入所需依赖2.验证码工具类3.具体实现逻辑(serviceimpl) 三、测试qq邮箱验证码 一、开通SMTP校验码 1.登…

zookeeper集群部署以及zookeeper原理

文章目录 简介工作原理特性官网地址准备节点准备环境准备JAVA主机映射 部署 简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服…

Codeforces Round 944 (Div. 4)(A,B,C,D,E,F,G,H)

比赛链接 这场不难&#xff0c; G G G 和 H H H 比较有意思。 G G G 题需要一定的二进制和数据结构的知识&#xff0c; H H H 题是个 2 − s a t 2-sat 2−sat 的题&#xff0c;算法名字吓人但是其实很简单&#xff0c;题目本身也很板&#xff0c;建议趁机学习一波。 A. My …

棒材直线度测量仪 专为圆形产品研发设计 在线无损检测

棒材直线度测量仪采用了先进的技术&#xff0c;能够实现在线无损检测&#xff0c;为生产过程提供了极大的便利。专为圆形产品设计&#xff0c;它能够精确测量棒材的米直线度及外径、椭圆度尺寸&#xff0c;为质量控制提供可靠的数据支持。 在线直线度测量仪不仅具有出色的性能…

Stm32串口搭配DMA实现自定义printf、scanf

前言:本文仅供学习参考使用&#xff0c;主要目的是让大家快速使用串口调试&#xff0c;文章所提及的GCC适用于Clion&#xff0c;Vscode等第三方编辑器的用户。作者有时间会继续更新^_^ 一、GCC环境 1、标准库 (1)、使用方法 在主函数while(1)初始化中&#xff0c;添加Seria…

嵌入式学习-M4的基本定时器

基本介绍 框图分析 时钟选择 计数器结构 开启重装载值寄存器的影子寄存器的工作时序图 未开启重装载值寄存器的影子寄存器的工作时序图 更新事件以及中断 相关寄存器 相关库函数

全球排名第一的质量管理(QMS)系统介绍,100%免费开源

什么是Odoo全程质量管理&#xff1f; 开源智造Odoo免费开源质量管理系统将政策、标准和实践规范化并自动化&#xff0c;以最小的开销提供最高质量的产品。快速轻松地选择要执行的测试&#xff0c;设置参数以评估结果&#xff0c;并定义接收时和生产过程中的测试策略。Odoo会自动…

OpenNJet产品体验:探索无限可能

文章目录 前言一、OpenNJet是什么&#xff1f;二、OpenNJet特性和优点三、OpenNJet功能规划四、OpenNJet快速上手五、OpenNJet的使用总结 前言 现代社会网络高速发展&#xff0c;同时也迎来了互联网发展的高峰&#xff0c;OpenNJet作为一个基于NGINX的面向互联网和云原生应用提…