这一篇文章主要分为两个部分,一个是I/O,一个是异常处理,是比较重要的(好像就没有不重要的)。
首先最重要的是记住这个几个包,是读写的基础:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
具体读文件的步骤是如下的,首先要知道这个文件名是什么?(文件名应当是字符串的形式,且准确无误包含后缀)假设我们这里知道了文件名是"input.txt";如果不知道可以让用户输入,这个就不再单独写了,大家应该都知道,不知道的翻前面文章去。
那么接下来是建立文件对象:
File inputFile = new File("input.txt");
然后使用File对象构造Scanner对象:
Scanner in = new Scanner(inputFile);
这时候的in已经可以处理了,包含文件的内容了。一般我们作业或应用里面会要求我们遍历in的内容,我们一般假设我们不知道有什么,所以用while循环:
while (in.hasNextLine()) {
String temp = in.nextLine();
... //处理
}
最后写文件需要用一个文件名(要求同之前的"input.txt")为新建文件名 :
PrintWriter out = new PrintWriter("output.txt");
实际案例如下:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
/**
This program reads a file with numbers, and writes the numbers to another
file, lined up in a column and followed by their total.
*/
public class Total
{
public static void main(String[] args) throws FileNotFoundException
{
// Prompt for the input and output file names
Scanner console = new Scanner(System.in);
System.out.print("Input file: ");
String inputFileName = console.next();
System.out.print("Output file: ");
String outputFileName = console.next();
// Construct the Scanner and PrintWriter objects for reading and writing
File inputFile = new File(inputFileName);
Scanner in = new Scanner(inputFile);
PrintWriter out = new PrintWriter(outputFileName);
// Read the input and write the output
double total = 0;
while (in.hasNextDouble())
{
double value = in.nextDouble();
out.printf("%15.2f\n", value);
total = total + value;
}
out.printf("Total: %8.2f\n", total);
in.close();
out.close();
}
}
读取其实可以分为按行读取,然后每一行又可以按单词读取,每个单词又可以按字母读取。其中是有一些要专门添加的代码来保障不会出错。
那么问题来了,如果Mary是Mary1,那么可以把这个 分离出去吗?答案是不能!所以为了规范化,要这么做:
Scanner in = new Scanner(System.in);
in.useDelimiter("[^A-Za-z]+");
同样对于单词提取每一个字母是要这么做的:
Scanner in = new Scanner(System.in);
in.useDelimiter("");
while (in.hasNext()){
char ch = in.next().charAt(0);
// 按你的要求处理字符ch
}
字符操作里面也有一些可供参考的方法:
混合读取的时候也会有一些陷阱,比如下面这个:
这就很糟糕了,因为我们本意是想国家和它的人口能够很好的分开,但是这样就使循环卡住了。
解决办法像下面这样做就可以了:
字符串转换成数字:
朋友,你是否疑惑过,像"123456"这样的字符串可以不可以转换成数字123456
所以下面这个方法对你来说是有用的:
int Num = Integer.parseInt("100");
// 或者
double Num = Double.parseDouble("100");
// 值得注意的是,你可能用用一个变量名而不是"100"这样的填充,但是如果你不确定
// 这个变量里面是不是单纯的一个数字字符,那么,就用trim方法去除空格吧
String a = "100";
double Num = Double.parseDouble(a.trim())
然后就是,格式化输出一定记得要用:
System.out.printf();
// f代表的意思就是format,格式化的意思
命令行参数是干什么的呢?是方便程序员调试用的!
相信同学你刚开始接触Java的时候一定不是很清楚这段代码是什么意思:
public static void main(String args[])
首先长时间的学习,你一定会写方法了吧,有返回值的方法前面跟数据类型,没有的前面跟void。public和static都是一些声明罢了。
那么方法的参数还记得怎么设置的吗?没错!就是在方法的括号里面写上数据类型和形参!这里的数据类型是String[]、形参是args。而这些参数是怎么传入的呢?就是在命令行窗口输入的。
举个例子:
这里有个代码,是凯撒密码加密解密的过程:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
/**
This program encrypts a file using the Caesar cipher.
*/
public class CaesarCipher
{
public static void main(String[] args) throws FileNotFoundException
{
final int DEFAULT_KEY = 3;
int key = DEFAULT_KEY;
String inFile = "";
String outFile = "";
int files = 0; // Number of command line arguments that are files
for (int i = 0; i < args.length; i++)
{
String arg = args[i];
if (arg.charAt(0) == '-')
{
// It is a command line option
char option = arg.charAt(1);
if (option == 'd') { key = -key; }
else { usage(); return; }
}
else
{
// It is a file name
files++;
if (files == 1) { inFile = arg; }
else if (files == 2) { outFile = arg; }
}
}
if (files != 2) { usage(); return; }
Scanner in = new Scanner(new File(inFile));
in.useDelimiter(""); // Process individual characters
PrintWriter out = new PrintWriter(outFile);
while (in.hasNext())
{
char from = in.next().charAt(0);
char to = encrypt(from, key);
out.print(to);
}
in.close();
out.close();
}
/**
Encrypts upper- and lowercase characters by shifting them
according to a key.
@param ch the letter to be encrypted
@param key the encryption key
@return the encrypted letter
*/
public static char encrypt(char ch, int key)
{
int base = 0;
if ('A' <= ch && ch <= 'Z') { base = 'A'; }
else if ('a' <= ch && ch <= 'z') { base = 'a'; }
else { return ch; } // Not a letter
int offset = ch - base + key;
final int LETTERS = 26; // Number of letters in the Roman alphabet
if (offset >= LETTERS) { offset = offset - LETTERS; }
else if (offset < 0) { offset = offset + LETTERS; }
return (char) (base + offset);
}
/**
Prints a message describing proper usage.
*/
public static void usage()
{
System.out.println("Usage: java CaesarCipher [-d] infile outfile");
}
}
检测到错误,然后抛出合适的异常即可。那么什么是合适的异常呢?见下图:
之前都说了 要检测异常的,那么检测也有它专门的语法!
上图中红字是框架,黑字是举例。
看见标题的同学应该就清楚了,我们要重点掌握的是受查异常。当然了,所谓的重点掌握也就是你需要理解其概念,然后我们一般遇到的异常也就是它了,不会有什么让你辨析的题目的。
这是我非常重视的一个问题!虽然我们现在学生阶段遇到的题目没什么一定说是要强调的,但是养成习惯有开有关!
为了方便,我是比较习惯下面的语法的,而且已经养成了相关习惯:
就是说try括号里面的一定会关闭!
就和Java自带的库的类一样,泛用性的东西它给设计好了,但是个性化的内容你要自己写!
举个例子:
在银行账户取钱,取出额度超了余额要报错!
public class InsufficientFundsException extends IllegalArgumentException
{
public InsufficientFundsException() {}
public InsufficientFundsException(String message)
{
super(message);
}
}
当然了,你写的异常类型也是基于Java自带的异常而发展的,不能凭空创造。