小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Java基础

Java,java,java-ee 额外说明

收录于:15天前

Java简介

Java是一种编程语言,也是一种高级语言。 Java针对不同的开发市场分为三种技术平台:JavaSE、JavaEE、JavaME。

JavaSE(Java Platform Standard Edition):标准版,是为开发普通桌面应用的解决方案,JavaEE和JavaME都由此发展而来,包括了Java的核心库,如数据类型,集合,数据库连接和网络编程等。

JavaEE(Java Platform Enterprise Eidtion):企业版,是为开发企业级应用的解决方案,包括Servlet,JSP,JavaBean,JDBC,EJB,WebService等技术。

JavaME(Java Platform Micro Edition):小型版,是为开发电子消费产品和嵌入式设备的解决方案。JavaME主要用于小型数字电子设备上的应用程序的开发,为家电增加智能化控制和网络功能,为手机增加新游戏和通讯录管理功能。JavaME提供了HTTP等高级Internet协议,使移动电话能以Client和Server的方式直接访问Internet的全部信息,提供高效的无线交流。

Java语言特点

  1. Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。引用和指针的区别引用指向一个对象,对引用操纵相当于对对象操作,指针指向内存地址,对指针操作相当于对内存空间操作。
  2. Java语言是面向对象的:它继承了封装性和多态性的特点。 Java语言提供了类、接口和继承等面向对象的特性,支持类之间的单继承,支持接口之间的多重继承,支持类与接口之间的实现机制。
  3. Java语言是分布式的:Java语言支持互联网应用程序的开发。在基本的Java应用程序编程接口中,有一个网络应用程序编程接口(java net),它为网络应用程序编程提供了类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制是也是开发分布式应用的重要手段。
  4. Java语言是跨平台的:它在Java平台上被编译成体系结构中立的字节码格式(带有类后缀的文件),然后可以在任何实现这个Java平台的系统上运行。
  5. Java语言支持多线程:Java语言支持多个线程同时执行,并提供了多个线程之间的同步机制,以提高程序运行效率。

JDK

JDK(Java Development Kit)是一套Java开发环境,包括Java编辑器、Java运行工具、Java文档生成工具、Java打包工具等。JDK环境用于Java参考程序的开发。

JRE(java Runtime Environment)是Java运行时环境,用于运行Java代码。非开发人员只需下载JRE即可运行Java应用程序。

开发Java应用程序需要需要安装JDK环境,官方下载JDK,安装并配置环境变量,doc命令输入:java -version和javac -version出现版本号即为安装成功。

在这里插入图片描述
JDK目录介绍:
在这里插入图片描述
在这里插入图片描述
bin目录:存放java可执行程序,如java.exe(运行工具)、javac.exe(java编辑器),jar.exe(打包工具,将java程序生成可重复应用的工具包),javadoc.exe(文档生成工具)等。
jre目录:java运行时环境目录,包括java虚拟机,运行时的工具包,java引用启动器等。
include目录:jdk是由c和c++实现的,需要引用c的一些头文件。
lib目录:java类库或库文件,是开发工具使用的归档包文件。
src.zip:存放jdk的核心源代码。
javafx-src.zip:javase桌面引用开发的源文件。

JDK中最重要的就是java.exejavax.exe以及jvm(Java Virtual Machine),javac用于编译java代码,java用于启动jvm并运行java代码。

包的定义与使用

同文件系统对目录的管理一样,java也引入了包机制,程序可以通过包的声明来对类定义目录。java中包是用来存放类的,功能相同的类放在同一个包中。
声明包用package声明类用class,**包的声明只能位于java源文件的第一行。**通过import关键字引入不同包下的类,包于包直接用.来区分。

package chapter.exanmple.Student

import chapter2.example.Teacher

class User{
    
	//代码
}

使用import package.*来导入包下的所有类。

在JDK中,不同功能的类方法在不同功能的包下,其中java包及其子包是核心包,javax即子包是扩展包。
Java的核心包:

java.util:包含大量工具类,集合等,如Arrays,List,Set。
java.net:包含网络编程的相关接口和类。
java.io:java输入输出有关的接口和类。
java.awt:java构建图形化界面相关的包和类。
java.swing:和awt一样构建桌面应用,最新的模块由javafx。
java.sql:数据库编程。

Java编程基础

每种编程语言都有自己的一套编程规范。 Java也有自己的编程规范,比如代码关键字、标识符、代码编写等。

Java代码格式

  • Java代码必须放在一个种类中(面向对象的规范),类用class声明:
//声明一个Sutdent类
class Student{
    
	//Java代码
}
  • Java程序代码分为结构体定义语句和函数执行语句。前者用于定义类或方法,后者用于实现具体功能。
class Student{
    
	//定义变量
	String name="zhansan";
	//执行功能
	System.out.print(name);
}
  • Java代码严格区分大小写,每条语句需用;隔开,用+连接需要换行的代码。
class Student{
    
	//三个不同的变量
	String Name="zhansan";
	String name="zhansan";
	String NNAME="zahnsan";
	//
	System.out.println(Name
	+name+
	NAME);
	
}
  • 方法用括号()声明,方法名首字母小写
 public void show(){
    
        System.out.println(name+"---"+price);
    }
 
//声明格式
修饰符 返回值类型 方法名 (参数列表){
    
	//执行体
	return 返回值
}
  • Java的单行注释是//,多行注释是/*...*/,文档注释是/**...*/。文档注释是对一段代码的概括描述使用javadoc.exe将注释生成文档。

  • 运行java程序必须要有一个主函数main

public class HelloWorld {
    
    /* 第一个Java程序 * 它将输出字符串 Hello World */
    public static void main(String[] args) {
    
        System.out.println("Hello World"); // 输出 Hello World
    }
}

在这里插入图片描述

Java标识符

程序中需要标识符来标记包名、类名、方法名、参数和变量等,这些符号称为标识符。标识符可以由字母数字下划线和美元符号组成,但标识符不能以数字或java关键字开头。定义标识符遵循以下规范:

  1. 包名中的所有字母必须小写;
  2. 类名和接口名首字母大写;
  3. 常量名称全部大写,单词之间用下划线连接;
  4. 变量名和方法名的第一个单词小写,后续单词的第一个字母大写。

Java关键字

Java变量

Java 语言是一种强类型语言。强类型包括以下两层含义:所有变量必须先声明后使用。指定类型的变量只能接受与其匹配的类型的值。

程序运行过程中,产生的临时数据存储在内存中,这些数据是通过标识符来访问的。 Java 变量是通过引用类型定义的。

在这里插入图片描述
整数类型一个byte占8为依次是16,32,64位,long定义时超过int的范围需要加L后缀。
浮点类型定义时要加fd后缀,没有会当作double类型。当是科学表达法是e或E为以10为底+-为正或负。

double 

字符类,用'...'包裹。

变量类型转换

  • 自动类型转换

自动转化必须满足两个条件:两种数据类彼此兼容,目标的取值范围大于源类型范围。
数值类型之间满足这两个条件可以自动转化:整数之间,整数转float,其他类型转double。

byte b=3;
int a=b;
  • 强制类型转换

强制类型转化需要显示声明,强制类型转化可能会造成数据丢失。显示转换需要用(目标类型)标识

double a=34.5
int b=(int) a;

// b=34
char[] b='1234';
int a=(int) b;

变量作用域

Java中主要有如下几种类型的变量:局部变量,类变量(静态变量),成员变量(非静态变量)变量需要在其作用范围类才可以使用,这个作用范围为作用域。
方法中定义的变量都是局部变量:
在这里插入图片描述
成员变量,类变量定义在方法外类中,通过修饰语(public)来管理作用域,其实不仅可以在该包或类,方法中使用还能再其他包,模块中使用。请参阅访问权限部分
成员变量:

public class Book {
    
    public String name;
    public double price;

    public Book(String name, double price){
    
        this.name=name;
        this.price=price;
    }

    public void show(){
    
        System.out.println(name+"---"+price);
    }
}

Java运算符

算数运行算符

在这里插入图片描述

  1. 进行自增、自减操作时,符号在前,表示先进行自增或自减,然后再进行其他操作。后面的标志是先进行运算,然后进行自增或自减。
  2. 除法运算时,整数被除以整数,只有涉及小数时才能得到小数。
  3. 取模运算时,运算结果符号取决于%符号左边的数。
赋值运算符

在这里插入图片描述

  1. 可以使用一个赋值语句来对多个变量进行赋值:
int x,y,z;
x=y=x=5;
  1. 类似+=的符号都是先加再赋值:
int a=0;
a +=3;
//相当于a先加3再赋值给a
比较运算符

在这里插入图片描述

逻辑运算符

在这里插入图片描述

运算符优先级

在这里插入图片描述

分支结构

if...else分支:

//if选择
if(条件判断){
    
	//选择体
}

//if...else...
if(...){
    
	//
}
else{
    
	//
}

//if...else if ... else ...
if(...){
    
	//
}
else if(...){
    
	//
}
else{
    
	//
}

switch分支

switch(条件){
    
	case 条件值1: 
		//
		break;
	case 条件值1: 
		//
		break;
	...
	default:
		//
		break;
}

循环结构

while 循环

while(循环条件){
    
	//执行语句
}

do...while 循环

//do...while循环会先执行依次子判断
do{
    
	//执行语句
}while(循环条件);

for循环

for(初始条件;循环条件;操作表达式){
    
	//循环体
}

breakcontinue:break是跳出整个循环,continue是结束本次循环。

方法

方法是可重用的单元。

方法定义

修饰符 返回值类型 方法名(参数类型 参数名){
    
    ...
    方法体
    ...
    return 返回值;
}

在这里插入图片描述

在这里插入图片描述
方法重载
Java程序允许再类中定义多个同名的方法,但是参数的类型和个数必须不同,这就是方法的重载。

class AddNumber{
    
	public int add(int a,int b){
    
		return a+b;
	}
	public int add(int a,int b,int c){
    
		return a+b+c;
	}
}

方法是解决一类问题的步骤的有序组合。方法包含在类或对象中。方法在程序中创建并在其他地方引用。

方法调用
Java 支持两种调用方法的方式,根据方法是否返回值来选择。

当程序调用方法时,程序的控制权将转移到被调用的方法。当执行被调用方法的返回语句或到达方法体右括号时,控制权返回给程序。

数组

您可以使用以下格式在 Java 中定义数组:

//声明式定义
int [] arr=new int[100];
/* 含义是声明一个数组命名为arr占100个空间 */

//初始化定义
int[] arr={
    ...}
/* 含义是声明一个int数组,赋值内容 */

数组初始化:

int [] a=new int[]{
    1,2,3,4};  //定义有空间,初始化要一致
int [] b={
    1234};

数组是通过下标访问的。

多维数组:

int [][] arr=new int[][];
//定义是可以直接定义为几行几列直接在[]赋值

int [][] arr={
    {
    1,2,3},{
    4,5,6}};
//定义时初始化,标识两行三列的数组

面向对象

说到面向对象,首先想到的就是面向过程。面向过程就是分析解决问题所需的方法步骤,然后一一实施这些步骤。面向对象就是将解决问题的任务划分为对象,然后通过调用对象来解决问题。在C语言中,不同的文件通过引用头文件来直接相互引用,但是这些头文件中的内容即使不需要也被直接执行。在面向对象中,对象在执行之前被实例化,并且在使用时被获取。

面向对象的特性

在这里插入图片描述

封装

类似对象的

类是对抽象事物的描述,对象是某一类事物的个体。各种对象都是通过类的实例化获得的。

类定义和对象创建

定义类用class关键字,创建对象用new关键字,类成员变量或方法的引用用.

修饰词 class 类名{
    
	//成员变量
	//成员方法

}
类名 变量 = new 类名();
public Person{
    
	public int age;

}

Person person=new Person();
prson.age;

变量在类中定义为成员变量,在方法中定义为局部变量。

类封装

类的封装是指在定义一个类时将类的属性私有化,使用private关键字,私有化的属性只能在类中被访问,外界想访问需要使用public关键字修饰公有方法,其中包括gettersetter方法。

public class Student{
    
	private int age;

	public void setAge(int age){
    
		this.age=age;
	}
	public int getAge(){
    
		return this.age
	}
	public String toString(){
    
		return this.age;
	}
}
施工方法

在类中,实例化类时,必须通过setter方法给属性赋值,并通过getter方法获取属性值。构造函数可以在实例化的同时给属性赋值。

构造方法的定义

要在类中定义构造函数方法,必须满足三个条件:

  1. 方法名与类名相同
  2. 方法名前没有返回值类型的声明
  3. 方法中没有返回值

构造函数重载
构造方法也可以重载,只要满足重载的条件,参数类型不同,参数个数不同即可。

在Java中,每个类都至少有一个构造函数。如果没有构造函数,系统会自动创建一个构造函数(无参数,无方法体)。

这个关键字
在类的方法中,变量的作用域是方法体内,如果要访问成员变量需要通过this关键字,this.成员变量this表示当前对象。

  • 可以通过this来访问类的成员变量
  • 可以通过 this 访问成员方法
  • 构造方法是实例化时调用的,也可以通过this调用this(参数列表)
垃圾收集

System.gc()实现垃圾回收。

静态关键字

Java的static关键字,用于修饰类的成员,如成员变量,成员方法,以及代码块。static修饰的变量为静态变量,静态变量被所有实例共享,通过类名.方法名访问不需要实例化,每次引用同一个对象。修饰方法为静态方法,也通过类名.方法名调用。修饰代码块,为静态代码块,类被加载时静态代码块会执行,静态代码块只执行一次。

最终关键字

final关键字用于修饰类,变量和方法,它时最终的含义,用该关键字修饰的类,方法,变量具有以下特性:

  1. Final修饰的类不能被继承
  2. 最终修改的方法不能被覆盖
  3. 由final修饰的变量是常量,只能赋值一次。

Java允许在类内定义类,称为成员内部类通过外部类.内部类 变量=new 外部类().new内部类()调用。

继承

继承是指在现有类的基础上构建新的类。构造出来的类是一个子类,子类自动拥有父类的所有属性和方法。

扩展关键子继承
一个类只能有一个直接父类。

public class Pig extends Animals{
    
	...
}

重写父类方法
在继承中,子类会继承父类的属性和方法,有时需要对父类的方法重写,重写需要与父类具有相同的方法名,参数列表及返回值类型。

超级关键词
子类重写父类方法后,需要访问父类的属性或方法用super关键字。super.成员变量super.成员方法(参数对列),访问父类的构造方法super(参数对列)

抽象类
当类的方法无法具体定义时,可以将其定义为抽象类,抽象类允许成员方法没有方法体,而具体的实现方法在继承的子类重写实现。抽象类通过abstract修饰。

抽象类无法实例化,需要通过子类继承并实例化。

abstract class Animal{
    
	abstract void shout();
} 

class Dog extends Animal{
    
	void shout(){
    
		System.out.println("汪汪");
	}
}

界面
当一个抽象类的所有方法都为抽象方法时,可以将该类定义为接口。接口克服了单继承的限制,一个类可以实现多个接口,接口的变量默认public static final修饰,即全局变量;接口的方法默认public修饰。

定义接口通过interface关键字,并由implements关键字实现该接口。多个接口的实现用,隔开。

//定义接口
public interface 接口名{
    
	[默认public static finnal修饰] 变量类型  变量
	[默认public abstract修饰] 方法名(参数列表)
}

//接口的实现类
public 类名 implements  接口名{
    
	//
} 


//实现多个接口
public implements 接口名1,接口名2 ...{
    
	//
}

多态

实例化类时,需要声明类的类型。由于实现的类不同而产生不同效果的现象就是多态。继承是多态性的基础。

//父类作为声明对象,子类作为实例化对象
Animal animal=new Dog()
/* 此时的animal具有Dog的特性 */

Animal animal=new Pig()
/* 此时的animal具有Pig的特性 */

对象类型的转换,子类当作父类对象使用。Animal animal=new Dog(),父类对象当作子类使用Dog dog=new Animal()

对象类
Object类是类参差结构的根类,所有类都直接或间接继承该类。

异常

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。Exception 类是 Throwable 类的子类。除了Exception类外,Throwable 还有一个子类 Error 。Java 程序通常不捕获错误。Error 用来指示运行时环境发生的错误。
在这里插入图片描述
在这里插入图片描述

捕获异常

try..catch捕获异常
try
{
    
   // 程序代码
}catch(ExceptionName e1)
{
    
   //Catch 块
}

//throws抛出异常
throws/throw关键字

public class className
{
    
   public void deposit(double amount) throws RemoteException
   {
    
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

最后关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。

 try{
    
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    
    // 程序代码
 }finally{
    
    // 程序代码
 }

可以使用多个catch语句,每个catch捕获相应的Exception及其子类。 JVM捕获异常后,会从上到下匹配catch语句。匹配到某个catch后,就会执行catch代码块,然后不再继续匹配。简单来说:多个catch语句只能执行其中一个。当有多个catch时,catch的顺序非常重要:子类必须先写。 finally 语句块保证执行,无论错误如何。

如何处理异常

在这里插入图片描述

try
{
    
   // 程序代码
}catch(Exception e)
{
    
   e.printStackTrace();
}

访问权限

类、成员变量和方法的修饰符控制它们的访问权限。

在这里插入图片描述

Java API

API是应用程序接口,调用Java的接口来实现各种功能。

String类

字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串。
在这里插入图片描述
最简单的创建方法:


String hello= "Hello world!";

Java StringBuffer 和 StringBuilder 类

修改字符串时,需要使用StringBuffer和StringBuilder类。

与 String 类不同,StringBuffer 和 StringBuilder 类的对象可以多次修改,而无需创建新的未使用的对象。

StringBuilder类是在Java 5中提出的,它与StringBuffer最大的区别在于StringBuilder的方法不是线程安全的。

Java Number类

data的基本数据类型:byte、int、short、long、double、float、boolean、char;

对应的包装类型也有八种:Byte、Integer、Short、Long、Double、Float、Character、Boolean;

基本数据类型只能存储变量,而相应的包装类包含操作变量的方法。

Java Character类

Java 语言为内置数据类型 char 提供了包装类 Character 类。Character类的用法:Character 类提供了一系列方法来操纵字符。
你可以使用 Character 的构造方法创建一个 Character 类对象,例如:

Character ch = new Character('a');

Date类

java.util包提供了Date类来封装当前日期和时间。

//获取的是系统的时间戳
DateFormat format=new SimpleDateFormat("YYYYMMdd");
//格式化时间

System与Runtime类

在这里插入图片描述
runtime类表示虚拟机的运行状态,用于封装JVM进程,该类是单例模式,对象不能直接实例化,通过:

Runtime run=Runtime.getRuntime();

Scanner 类

java.util.Scanner是Java5的新特性。我们可以通过Scanner类获取用户输入。

 Scanner sc = new Scanner(System.in); 

Scanner 类的 next() 和 nextLine() 方法获取输入字符串。在读取之前,我们一般需要使用hasNext和hasNextLine来判断是否还有输入数据:

import java.util.Scanner; 

public class ScannerDemo {
      
    public static void main(String[] args) {
      
        Scanner scan = new Scanner(System.in); 
		// 从键盘接收数据 

		//next方式接收字符串
        System.out.println("next方式接收:");
        // 判断是否还有输入
        if(scan.hasNext()){
       
        	String str1 = scan.next();
        	System.out.println("输入的数据为:"+str1);  
        }  

    }  
} 

next()与nextLine()区别
next():

1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next()不能得到带有空格的字符串。
nextLine():

1、以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。

Math与Random类

Math是数学计算类,random用于生成随机数。

import java.lang.math;

Random random=new Random();

在这里插入图片描述

集合

在这里插入图片描述

集合接口方法:

在这里插入图片描述

List接口

List接口方法:
在这里插入图片描述
ArrayList和LinkedList是顺序表和链表。

Iterrater接口

迭代器接口
Iterater接口是逸代器,用来遍历集合的元素。

ArrayList list=new ArrayList();

Iterater iterater=new Iterater();
while(iterater.hasNext()){
    
	Object obj=iterater.next();
	System.out.print(obj);
}

foreach循环
foreach循环也是用来遍历集合的元素的。

for(容器中元素类型 变量 : 集合容器){
    
	//执行语句
}

Set接口

set接口中的元素不重复,set和list的访问元素相同。

Map接口

地图界面
Map接口时一种双列集合,每个元素存储一个键(key)对象和一个值对象(value),键和值对象对应关系为映射。Map的一个元素时一个Entry包含一个key-value。Map的键必须唯一。遍历Map通过获取键来遍历所有键取值或获取Entry再遍历。
在这里插入图片描述

Properties集合

属性集合
Properties集合主要用来存储key-value字符串的,通过该集合来获取配置项。通过setPropertiesgetPropertes存取字符串,通过propertiesNames()方法得到包含所有键的集合对象。

泛型

集合可以存储任何类型的对象,但是把一个对象存入到集合后,集合会忘记这个对象的类型,只有再取出的时候,才编译为Object类型。如果事先不记得,声明时发生类型转换就会出错。Java引入了泛型的概念,即参数化类型。在操作集合时限定元素的类型,在定义集合时通过<T>指定该集合中元素数据类型,这样显示声明,就可以知道集合中元素的类型了。

//声明泛型
ArrayList<String> arr=new ArrayList<String>();

//该List集合只能存储String类

IO

应用程序之间需要与设备之间进行数据传输,例如显示屏输入数据,显示程序运行结果。在Java中不同设备之间的数据传输称为。位于java.io包中。

IO流有很多,按照操作数据的不同分为字节流和字符流,按照传输方向的不同分为输入流和输出流。
在这里插入图片描述
在IO包中字节流的输入输出用java.io.InputStreamjava.io.OutputStream
在IO包中字符流的输入输出用java.io.Readerjava.io.Writer

在这里插入图片描述
字节流 输入流
在这里插入图片描述

  1. InputStream是所有输入字节流的父类,它是一个抽象类。

  2. ByteArrayInputStream、StringBufferInputStream(上图中的StreamBufferInputStream)、FileInputStream是三种基本的媒体流。它们分别从Byte数组、StringBuffer和本地文件中读取数据。

  3. PipedInputStream 从与其他线程共享的管道中读取数据。

  4. ObjectInputStream 和 FilterInputStream 的所有子类都是装饰流(装饰器模式的主角)。

字节输出流
在这里插入图片描述

  1. OutputStream是所有输出字节流的父类,它是一个抽象类。

  2. ByteArrayOutputStream 和 FileOutputStream 是两种基本的媒体流。它们分别将数据写入字节数组和本地文件。 PipedOutputStream 将数据写入与其他线程共享的管道。

  3. ObjectOutputStream 和 FilterOutputStream 的所有子类都是装饰流。

字符流输入流:
在这里插入图片描述

  1. Reader是所有输入字符流的父类,它是一个抽象类。

  2. CharReader和StringReader是两种基本的媒体流,分别从Char数组和String中读取数据。 PipedReader 从与其他线程共享的管道中读取数据。

  3. BufferedReader显然是一个装饰器,它及其子类负责装饰其他Reader对象。

  4. FilterReader 是所有自定义特定装饰流的父类。它的子类 PushbackReader 修饰 Reader 对象并添加行号。

  5. InputStreamReader是连接字节流和字符流的桥梁。它将字节流转换为字符流。 FileReader可以说是实现这个功能的常用工具类。在其源码中,明显使用了将FileInputStream转换为Reader的方法。我们可以从这堂课中学到一些技巧。 Reader中各个类的用途和用法与InputStream中的基本相同。后面Reader和InputStream就会有对应关系。

字符输出流:
在这里插入图片描述

  1. Writer是所有输出字符流的父类,是一个抽象类。

  2. CharArrayWriter 和 StringWriter 是两种基本媒体流,分别将数据写入 Char 数组和 String。 PipedWriter 将数据写入与其他线程共享的管道。

  3. BufferedWriter是一个装饰器,为Writer提供缓冲功能。

  4. PrintWriter和PrintStream非常相似,它们的功能和用途也非常相似。

  5. OutputStreamWriter是OutputStream转换为Writer的桥梁,它的子类FileWriter实际上就是实现这个功能的具体类。功能和用法与OutputStream非常相似。

系统类 系统支持IO

System类支持IO,并且系统类的方法是静态的。直接调用系统就可以了。系统提供标准的输入输出设备,如键盘、显示器等,用于IO的信息交换。

在这里插入图片描述
System.in(标准输入),通常代表键盘输入。借助Scanner类。

System.out(标准输出):通常写往显示器。

System.err(标准错误输出):通常写往显示器。

字节流

在计算机中,无论时文本,图片,还是音频,视频,所有文件都是以二进制(字节)形式存在的,IO中针对字节的输入输出统称为字节流。输入输出用java.io.InputStreamjava.io.OutputStream是两个顶级接口。
在这里插入图片描述

InputStream的常用方法
在这里插入图片描述
OutputStream的常用方法
在这里插入图片描述
在这里插入图片描述
FileInputStream 常用的构造方法主要有如下两种重载形式。

  • FileInputStream(File file):通过打开与文件系统中File对象文件指定的实际文件的连接来创建FileInputStream。
  • FileInputStream(String name):通过打开文件系统中路径名 name 指定的实际文件的链接来创建 FileInputStream。

FileOutputStream类的构造方法主要有以下四种重载形式。

  • FileOutputStream(File file):创建文件输出流,参数file指定目标文件。
  • FileOutputStream (File file, boolean append):创建文件输出流。参数文件指定目标文件。指定是否在目标文件内容末尾添加数据。如果为真,则添加在最后;如果为假,则覆盖原始内容。有内容;它的默认值为 false。
  • FileOutputStream(String name):创建文件输出流。参数name指定目标文件的文件路径信息。
  • FileOutputStream(String name,booleanappend):创建文件输出流,参数name和append含义同上。

字节流读取文件

FileInputStream(String fileName);
//创建文件输入流

文件数据是一种常见的IO操作,对文件的读写有专门的两个类FileOutputStreamFileInputStream

//核心步骤

FileInputStream fis2 = new FileInputStream("F:/mxl.txt");
//处理传递文件名也可以传递File对象

字节流输出文件

FileOutputStream(String fileName,boolean append)
//创建文件输出流,append表示是否为追加

定义文件路径是要是用\\因为\是表示转义字符。

字节缓冲流
在字节流读取中通过read方法,将字节读取一个一个读取到目标中,这样效率很低,虽然提供了read(byte [] byte)方法,但是事先并不知道字节流长度。Java提供了字节缓冲流来提高效率。

在这里插入图片描述
用法都差不多。

字符流

尽管 Java 中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但使用字符流是操作字符集更方便。
在这里插入图片描述

在这里插入图片描述
Java 提供了用来读取字符文件的便捷类——FileReader。该类的构造方法有如下两种重载形式。

  • FileReader(File file):根据要从中读取数据的文件创建一个新的 FileReader 对象。其中 file 表示要从中读取数据的文件。
  • FileReader(String fileName):根据要从中读取数据的文件名创建一个新的 FileReader 对象。其中,fileName表示要读取数据的文件名,表示文件的完整路径。

Java提供了一个方便的类来编写字符文件——FileWriter。该类的构造函数有以下四种重载形式。

  • FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象。其中,file表示要写入数据的File对象。
  • FileWriter(File file,boolean append):用指定的 File 对象构造一个 FileWriter 对象。如果append的值为true,则字节将写入文件末尾而不是文件开头。
  • FileWriter(String fileName):根据给定的文件名构造一个 FileWriter 对象。其中,fileName表示要写入字符的文件名,表示完整路径。
  • FileWriter(String fileName,boolean append):根据给定的文件名和写入文件的位置构造一个 FileWriter 对象。其中,append是一个布尔值。如果为 true,则数据将写入文件末尾而不是文件开头。

字符缓冲流

  • 字符缓冲区输入流

BufferedReader类主要用于辅助其他字符输入流。它有一个缓冲区,可以先将一批数据读入内存缓冲区。后续的读取操作可以直接从缓冲区获取数据,而不需要每次都从数据源读取数据并进行字符编码转换,可以提高数据读取的效率。

BufferedReader类的构造函数有以下两种重载形式。

  • BufferedReader(Reader in):创建一个BufferedReader,用于修改参数in指定的字符输入流。
  • BufferedReader(Reader in,int size):创建一个BufferedReader来修改参数in指定的字符输入流,参数size用于以字符为单位指定缓冲区的大小。

BufferedReader 还提供了 readLine() 方法,该方法返回一个包含该行内容的字符串,不带任何终止符,如果已到达流末尾,则返回 null。 readLine()方法表示一次读取一行文本内容。当换行符(\n)、回车符(\r)或回车符后面直接跟换行符时,则认为一行已终止。

  • 字符缓冲区输出流

BufferedWriter类主要用于辅助其他字符输出流。它还有一个缓冲区。您可以先将一批数据写入缓冲区。当缓冲区满时,可以立即将缓冲区中的数据写入字符输出流。其目的是提高数据写入效率。

BufferedWriter类的构造函数有以下两种重载形式。

  • BufferedWriter(Writer out):创建一个BufferedWriter,用于修改参数out指定的字符输出流。
  • BufferedWriter(Writer out,int size):创建一个BufferedWriter,用于修改参数out指定的字符输出流。参数 size 用于指定缓冲区的大小(以字符为单位)。

该类除了为字符输出流提供缓冲区外,还提供了一个新方法newLine(),用于写入行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个换行符 (\n)。

文件类

在Java中,File类是java.io包中唯一代表磁盘文件本身的对象。也就是说,如果要在程序中操作文件和目录,可以通过File类来进行。 File类定义了一些操作文件的方法,例如创建、删除、重命名文件和目录。

File 类无法访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

系统流

每个Java程序运行时都会有一个系统流,系统流对应的类是java.lang.System。 Sytem类封装了Java程序运行时的三个系统流程,分别通过in、out和err变量来引用。

  • System.in:标准输入流,默认设备是键盘。
  • System.out:标准输出流,默认设备是控制台。
  • System.err:标准错误流,默认设备是控制台。

System.in 是InputStream 类的对象。 System.in.read()方法实际上访问的是InputStream类定义的read()方法。该方法从键盘读取一个或多个字符。 System.out输出流主要用于向控制台输出指定的内容。

System.out 和 System.error 是 PrintStream 类的对象。由于 PrintStream 是从 OutputStream 派生的输出流,因此它还实现了低级 write() 方法。因此,除了print()和println()方法可以完成控制台输出外,System.out还可以调用write()方法来实现控制台输出。

PrintStream和PrintWriter

PrintStream 扩展了 OutputStream 的接口,并提供了用于写入各种数据类型的附加方法:

  • 写int: print(int)
  • 写入布尔值: print(boolean)
  • 写入字符串: print(String)
  • 写入Object:print(Object),实际上相当于print(object.toString())

避免了只能通过write来写入字节的缺陷。经常使用的System.out.println()实际上是使用PrintStream来写入各种数据。其中System.out是系统默认提供的PrintStream。

与OutputStream相比,PrintStream不仅增加了一组可以打印各种数据类型的print()/println()方法,更加方便,它还有一个额外的优点,就是不会抛出IOException,所以当我们写的时候代码中,无需捕获 IOException。

PrintStream最终输出的始终是字节数据,而PrintWriter扩展了Writer接口,其print()/println()方法最终输出的是char数据。

. . .

相关推荐

额外说明

buuctf:LSB

下载解压得到一张图片,因为题目是LSB隐写我们就用stegsolve打开, LSB隐写介绍就参考大佬的博文,超详细https://blog.csdn.net/weixin_34075268/article/details/88744599.(转载)还有s

额外说明

电子商务平台市场动向的数据分析平台:阿里商品指数,包括淘宝采购指数,淘宝供应指数,1688供应指数。

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用 CSDN 平台,自主完成项目设计升级,提升自

额外说明

总结Synchronized与Lock的区别

存在层次上 synchronized: Java的关键字,在jvm层面上 Lock: 是一个接口 锁的释放 synchronized: 1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁 Lock: 在finally中必

额外说明

线程池管理类和线程池类

一.线程池管理类 /** * 线程池管理类 */ public class ThreadPoolFactory { private static final Log logger = LogFactory.getLog(ThreadP

额外说明

【语音识别】玩转语音识别 1 语音识别简介

【语音识别】⚠️玩转语音识别 1⚠️ 语音识别简介 概述 语音识别的历史 语音识别的应用 概述 从今天开始我们将开启一个新的深度学习章节, 为大家来讲述一下深度学习在语音识别 (Speech Recognition) 的应用. 语音识别技术可以将语音转换

额外说明

【NLP】⚠️学不会打我! 半小时学会基本操作 2⚠️ 关键词

【NLP】⚠️学不会打我! 半小时学会基本操作 2⚠️ 关键词 概述 关键词 TF-IDF 关键词提取 TF IDF TF-IDF jieba TF-IDF 关键词抽取 jieba 词性 不带关键词权重 附带关键词权重 TextRank 概述 从今天开始

额外说明

PyTorch 卷积神经网络简介

卷积神经网络简介 概述 架构 卷积是什么 图像颜色通道 特征图个数 堆叠的卷积层 卷积层参数 步长 卷积核尺寸 边界填充 卷积核个数 卷积结果计算公式 卷积参数共享 池化层 最大池化 平均池化 (不推荐) 最小池化 (不推荐) 特征图 感受野 经典网络

额外说明

记一次linux pv missing故障

现象描述: linux一个逻辑卷lv_home丢失,无法正常挂载,之前挂载在/home目录下: [root@VM001 ~]# cat /etc/fstab ....... /dev/VolGroup/lv_home /home

额外说明

PHP实践:用openssl打造安全可靠的API签名验证系统

-作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 -数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 -本文已收录于PHP专栏:PHP进阶实战教程。 -另有专栏PHP入

ads via 小工具