JAVA学习笔记(十一)输入/输出和异常处理

这一篇文章主要分为两个部分,一个是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();
   }
}

 读取的小细节与格式化输出

读取的小细节

读取其实可以分为按行读取,然后每一行又可以按单词读取,每个单词又可以按字母读取。其中是有一些要专门添加的代码来保障不会出错。

JAVA学习笔记(十一)输入/输出和异常处理_第1张图片

那么问题来了,如果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

}

 字符操作里面也有一些可供参考的方法:

JAVA学习笔记(十一)输入/输出和异常处理_第2张图片

混合读取的时候也会有一些陷阱,比如下面这个:

 JAVA学习笔记(十一)输入/输出和异常处理_第3张图片

JAVA学习笔记(十一)输入/输出和异常处理_第4张图片

 这就很糟糕了,因为我们本意是想国家和它的人口能够很好的分开,但是这样就使循环卡住了。

解决办法像下面这样做就可以了:

JAVA学习笔记(十一)输入/输出和异常处理_第5张图片

字符串转换成数字:

朋友,你是否疑惑过,像"123456"这样的字符串可以不可以转换成数字123456 

所以下面这个方法对你来说是有用的:

int Num = Integer.parseInt("100");

// 或者

double Num = Double.parseDouble("100");

// 值得注意的是,你可能用用一个变量名而不是"100"这样的填充,但是如果你不确定

// 这个变量里面是不是单纯的一个数字字符,那么,就用trim方法去除空格吧

String a = "100";

double Num = Double.parseDouble(a.trim())

 格式化输出

这个是老生常谈的东西辣,别的不说,上图先:
JAVA学习笔记(十一)输入/输出和异常处理_第6张图片

 JAVA学习笔记(十一)输入/输出和异常处理_第7张图片

 然后就是,格式化输出一定记得要用:

System.out.printf();

// f代表的意思就是format,格式化的意思

命令行参数

命令行参数是干什么的呢?是方便程序员调试用的!

相信同学你刚开始接触Java的时候一定不是很清楚这段代码是什么意思:

public static void main(String args[])

首先长时间的学习,你一定会写方法了吧,有返回值的方法前面跟数据类型,没有的前面跟void。public和static都是一些声明罢了。

那么方法的参数还记得怎么设置的吗?没错!就是在方法的括号里面写上数据类型和形参!这里的数据类型是String[]、形参是args。而这些参数是怎么传入的呢?就是在命令行窗口输入的。

举个例子:

JAVA学习笔记(十一)输入/输出和异常处理_第8张图片

JAVA学习笔记(十一)输入/输出和异常处理_第9张图片 

这里有个代码,是凯撒密码加密解密的过程: 

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");
   }
}

 异常处理

抛出异常

检测到错误,然后抛出合适的异常即可。那么什么是合适的异常呢?见下图:

JAVA学习笔记(十一)输入/输出和异常处理_第10张图片

捕获异常

之前都说了 要检测异常的,那么检测也有它专门的语法!

JAVA学习笔记(十一)输入/输出和异常处理_第11张图片

上图中红字是框架,黑字是举例。

 受查异常

JAVA学习笔记(十一)输入/输出和异常处理_第12张图片

看见标题的同学应该就清楚了,我们要重点掌握的是受查异常。当然了,所谓的重点掌握也就是你需要理解其概念,然后我们一般遇到的异常也就是它了,不会有什么让你辨析的题目的。

关闭资源 

这是我非常重视的一个问题!虽然我们现在学生阶段遇到的题目没什么一定说是要强调的,但是养成习惯有开有关!

为了方便,我是比较习惯下面的语法的,而且已经养成了相关习惯:

JAVA学习笔记(十一)输入/输出和异常处理_第13张图片

就是说try括号里面的一定会关闭! 

设计自己的异常

就和Java自带的库的类一样,泛用性的东西它给设计好了,但是个性化的内容你要自己写!

举个例子:
在银行账户取钱,取出额度超了余额要报错!

public class InsufficientFundsException extends IllegalArgumentException
{
   public InsufficientFundsException() {}
   public InsufficientFundsException(String message)
   {
      super(message);
   }
}

当然了,你写的异常类型也是基于Java自带的异常而发展的,不能凭空创造。

你可能感兴趣的:(课程学习,java,学习)