package com.stream.demo;
import java.util.stream.Stream;
public class MyStream5 {
public static void main(String[] args) {
Stream.of(1,2,3,4,5,6,7,8).forEach(s-> System.out.println(s));
}
}
单列集合
package com.stream.demo;
import java.util.ArrayList;
import java.util.stream.Stream;
public class MyStream2 {
public static void main(String[] args) {
//单列集合
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// Stream stream = list.stream();
// stream.forEach(s-> System.out.println(s));
list.stream().forEach(s-> System.out.println(s));
}
}
双列集合
package com.stream.demo;
import java.util.HashMap;
public class MyStream3 {
public static void main(String[] args) {
//双列集合
HashMap<String,Integer> hm = new HashMap<>();
hm.put("zhangsan",23);
hm.put("lisi",24);
hm.put("wangwu",25);
hm.put("zhaoliu",26);
hm.put("qianqi",27);
//双列集合不能直接获取Stream流
//KeySet //先获取所有的键
//再把这个Set集合中所有的键放到Stream流中
// hm.keySet().stream().forEach(s-> System.out.println(s));
//entrySet
// 先获取到所有键值对对象
//再把这个Set集合中所有的键值对对象放到Stream流中
hm.entrySet().stream().forEach(s-> System.out.println(s));
}
}
数组
package com.stream.demo;
import java.util.Arrays;
public class MyStream4 {
public static void main(String[] args) {
//数组
int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(s -> System.out.println(s));
}
}
package com.stream.demo;
import java.util.ArrayList;
import java.util.stream.Stream;
public class MyStream7 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三丰");
list.add("张无极");
list.add("张翠山");
list.add("王二麻子");
list.add("张良");
list.add("谢广坤");
//Stream limit (long maxSize) 截取指定参数个数的数据
list.stream().limit(2).forEach(s -> System.out.println(s));
//Stream skip(long n ) 跳过指定参数个数的数据
list.stream().skip(2).forEach(s -> System.out.println(s));
//static Stream concat (Stream a,Stream b) 合并a和b两个流为一个流
System.out.println("---------------------");
ArrayList<String> list2 = new ArrayList<>();
list2.add("张三丰");
list2.add("张无极");
list2.add("张翠山");
list2.add("王二麻子");
list2.add("张良");
list2.add("谢广坤");
list2.add("谢广坤");
list2.add("谢广坤");
list2.add("谢广坤");
list2.add("谢广坤");
list2.add("谢广坤");
list2.add("谢广坤");
// Stream stream1 = list.stream();
// Stream stream2 = list2.stream();
//
// Stream stream3 = Stream.concat(stream1, stream2);
// stream3.forEach(s-> System.out.println(s));
Stream.concat(list.stream(), list2.stream()).forEach(s -> System.out.println(s));
System.out.println("------------------==================");
//Stream distinct() : 去除流中重复的元素。 依赖(hashcode和equals方法)
list2.stream().distinct().forEach(s -> System.out.println(s));
}
}
import java.util.ArrayList;
import java.util.function.Consumer;
public class MyStream8 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三丰");
list.add("张无极");
list.add("张翠山");
list.add("王二麻子");
list.add("张良");
list.add("谢广坤");
//void foreach(Consumer action) 对此流的每个元素执行操作
// Consumer接口中的方法 void accpect(T t) 对给定的参数执行操作
//在forEach方法中的底层,会循环获取到流中的每一个数据
//并循环调用acceot方法,并把每一个数据传递给accpect方法
//s就依次表示流中的每一个数据
//所以,只要在accep方法中,写上处理的业务逻辑就可以
list.stream().forEach(
new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
}
);
System.out.println("6666666666666666666666666666666");
list.stream().forEach(
(String s) -> {
System.out.println(s);
}
);
System.out.println("6666666666666666666666666666666");
list.stream().forEach(s -> System.out.println(s));
//long count() 返回此流中的元素数
long count = list.stream().count();
System.out.println(count);
}
}
package com.stream.demo;
import java.util.ArrayList;
public class MyStream9 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list.add(i);
}
// list.stream().filter(
// (Integer i) -> {
// return i % 2 == 0;
// }
// );
list.stream().filter(number -> number % 2 == 0).forEach(number -> System.out.println(number));
System.out.println("========================");
System.out.println(list);
}
}
package com.stream.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class MyStream0 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list1.add(i);
}
list1.add(10);
list1.add(10);
list1.add(10);
list1.add(10);
list1.add(10);
list1.add(10);
list1.add(10);
//filter负责过滤数据的
//collect负责收集数据
//获取流中剩余数据,但是他不负责创建容器,也不负责把数据添加到容器
//Collectors.toList() 底层会创建一个List集合,并把所有的数据添加到List集合中
List<Integer> list = list1.stream().filter(number -> number % 2 == 0)
.collect(Collectors.toList());
System.out.println(list);
Set<Integer> set = list1.stream().filter(number -> number % 2 == 0)
.collect(Collectors.toSet());
System.out.println(set);
}
}
package com.stream.demo;
import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;
public class MyStream10 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("zhangsan,23");
list.add("lisi,24");
list.add("wangwu,25");
Map<String, Integer> map = list.stream().filter(
s -> {
String[] split = s.split(",");
int age = Integer.parseInt(split[1]);
return age >= 24;
}
/**
* collect方法只能获取到流中剩余的每一个数据
* 在底层不能创建容器,也不能把数据添加到容器当中
* collectors,toMap创建一个map集合并将数据添加到集合
* s一次表示流中的每一个数据
* 第一个lambda表达式如何获取map中键
* 第2个lambda表达式如何获取map中值
*/
).collect(Collectors.toMap(
(String s) -> {
return s.split(",")[0];
},
(String s) -> {
return Integer.parseInt(s.split(",")[1]);
}
));
System.out.println(map);
}
}
1、可以将数据从本地文件读取出来
2、可以将数据从内存保存到本地文件
1、在读写数据时告诉虚拟机要操作的(文件/文件夹)在哪
2、对(文件/文件夹)本身进行操作,包括创建、删除等
File:它是文件和目录路径名的抽象表示
package com.stream.fiedemo;
import java.io.File;
public class FileDemo1 {
public static void main(String[] args) {
// method1();
//method2();
//method3();
}
private static void method3() {
//File(File parent,String child)
//从父抽象路径名和子路径名字符串创建新的File实例
File file1 = new File("D:\\itheima");
String path = "a.txt";
File file = new File(file1, path);
System.out.println(file);
}
private static void method2() {
//File(String parent,String child)
//从父路径名字符串和子路名字符串创建新的File实例
String path1 = "D:\\itheima";
String path2 = "a.txt";
File file = new File(path1, path2);//将两个路径拼接
System.out.println(file);
}
private static void method1() {
//file(String pathname)通过将给定的路径名字符串转换为抽象路径来创建新的File
String path = "D:\\itheima\\a.txt";
File file = new File(path);
//为什么要把字符串表示形式的路径变成File对象
//就是为了使用File里面的方法
}
}
package com.stream.fiedemo;
import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args) throws IOException {
//public boolean createNewFile() 创建一个新的空的文件
/**
* 如果文件存在,创建失败,返回false
* 如果文件不存在,创建成功,返回true
* createNewFile方法不管调用者有没有后缀名,只能创建文件
*/
//public boolean mkdir() 创建一个单级文件夹
/**
* 只能创建单级文件夹,不能创建多级文件夹
* 无论调用者有没有后缀名,只能创建单机文件夹
*/
//public boolean mkdirs() 创建一个多级文件夹
/**
* 可以创建单级文件夹
* 也可以创建多级文件夹
* 只能创建文件夹
*/
//method1();
//method2();
File file = new File("D:\\itheima\\aaa\\bb\\cc\\ddd");
boolean result = file.mkdirs();
System.out.println(result);
}
private static void method2() {
File file = new File("D:\\itheima\\aaa");
boolean result = file.mkdir();
System.out.println(result);
}
private static void method1() throws IOException {
File file1 = new File("D:\\itheima\\a.txt");
boolean result1 = file1.createNewFile();
System.out.println(result1);
}
}
package com.stream.fiedemo;
import java.io.File;
public class FileDemo3 {
public static void main(String[] args) {
/**
* 不走回收站的
* 删除的是文件,直接删除,如果删除的是文件夹,只能删除空间文件夹
* 只能删除文件和空文件夹
*
*/
//method1();
File file = new File("D:\\itheima");
boolean result = file.delete();
System.out.println(result);
}
private static void method1() {
File file = new File("D:\\itheima\\a.txt");
boolean result = file.delete();
System.out.println(result);
}
}
package com.stream.fiedemo;
import java.io.File;
public class FileDemo5 {
public static void main(String[] args) {
File file = new File("D:\\");
File[] files = file.listFiles();
for (File path : files) {
System.out.println(path);
}
/**
* 进入文件夹,获取这个文件夹里面所有的文件和文件夹File对象,并把这些File对象都放在一个数组中返回
* 包括隐藏文件和隐藏文件夹都可以获取
*/
}
}
目的
package com.output;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputDemo2 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
/**
* 如果文件不存在,会帮我们自动创建文件
* 如果文件存在,会把文件清空
*/
FileOutputStream fos = new FileOutputStream("D:\\Javase\\a.txt");
//写数据
fos.write(97);
//释放资源
fos.close();
}
}
字节流写数据
步骤:
1、 创建字节输出流对象
注意事项:
package com.output;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputDemo3 {
public static void main(String[] args) throws IOException {
/**
* 第二个参数就是续写开关,没有传递,默认是false
* 表示不打开续写功能,那么创建对象的这行代码会清空文件
* 如果第二个参数true,表示打开续写功能
* 那么创建对象的这行代码不会清空文件
*/
FileOutputStream fos = new FileOutputStream("io\\a.txt",true);
fos.write(97);
fos.write("\r\n".getBytes());
fos.write(98);
fos.write("\r\n".getBytes());
fos.write(99);
fos.write("\r\n".getBytes());
fos.write(100);
fos.write("\r\n".getBytes());
fos.write(101);
fos.write("\r\n".getBytes());
fos.write(102);
fos.close();
}
}
解决速度问题,字节流通过创建字节数组,可以一次读多个数据
一次读一个字节数组的方法:
可以操作(拷贝)所有类型文件
可以提高效率
不能直接操作文件,需要传递字节流
import java.io.FileInputStream;
import java.io.IOException;
public class OutputDemo4 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("io\\a.txt");
int red =fis.read();
/**
* 一次读取一个字节,返回值就是本次读到的那个字节数据
* 也就是字符在码表中对应的那个数字
* 如果我们想要看到的字符数据,要转成强转char
*/
System.out.println((char)red);
fis.close();
}
}
import java.io.FileInputStream;
import java.io.IOException;
public class OutputDemo5 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("io\\a.txt");
int b ;
while ((b =fis.read())!=-1){
System.out.println((char)b);
}
fis.close();
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputDemo7 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\itheima\\a.jpg");
FileInputStream fis = new FileInputStream("io\\a.jpg");
byte[] bytes = new byte[1024];
int len; //本次读取到的有效字节个数 -- 这次读了几个字节
while ((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fis.close();
fos.close();
}
}
public class OutputDemo8 {
public static void main(String[] args) throws IOException {
//缓冲流拷贝文件
//创建一个字节缓冲输入流
//在底层创建了一个默认长度8192的字节数组
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("io\\a.jpg"));
//字节缓冲输出流
//在底层创建了一个默认长度8192的字节数组
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("io\\copoy.jpg"));
int b;
while ((b = bis.read())!=-1){
bos.write(b);
}
bis.close();
bos.close();
}
}
import java.io.*;
public class OutputDemo9 {
//缓冲流结合数组,进行文件拷贝
public static void main(String[] args) throws IOException {
//创建一个字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\itheima\\a.jpg"));
//创建一个字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("io\\aop.jpg"));
byte[] bytes = new byte[1024];
int len;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
bis.close();
bos.close();
}
}
乱码
因为字节流读中文,每次只能读一部分所以出现乱码
不管在那张表中,中文的第一个字节一定是负数
字符流 = 字节流 + 编码表
GBK码表一个中文两个字节
UTF-8编码格式一个中文3个字节
把文件中数据读到内存中,使用字符输入流
把内存中的数据写到文件中,使用字符输出流
进行拷贝,一律用字节流或者字节缓冲流
BufferedWriter: 可以将数据高效的写出
BufferedReader: 可以将数据高效的读取到内存。
对象操作流特点
可以把对象以字节的形式写到本地文件,直接打开文件,是读不懂的,需要再次用对象操作流读到内存中。
对象操作流分两类,对象操作输入流和对象操作输出流
对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输对象
对象操作输入流(对象反序列化流):把写到本地文件中的对象读到内存中,或者接收网络中传输的对象
package com.propertiesio;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class PropertiesDemo1 {
public static void main(String[] args) {
Properties prop = new Properties();
// 增
prop.put("郭达", "杰森斯坦森");
prop.put("曹操", "曹植");
prop.put("刘秀", "刘邦");
prop.put("嬴政", "秦王");
System.out.println(prop);
//删除
prop.remove("曹操");
System.out.println(prop);
//改
prop.put("郭达", "画虎");
System.out.println(prop);
//查
Object v = prop.get("嬴政");
System.out.println(v);
//遍历
Set<Object> keys = prop.keySet();
for (Object key : keys) {
Object value = prop.get(key);
System.out.println(key + "=" + value);
}
System.out.println("--------------------");
//装的是所有的键值对
Set<Map.Entry<Object, Object>> entries = prop.entrySet();
for (Map.Entry<Object, Object> entry : entries) {
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + "=" + value);
}
}
}