Java Basic Learning 16 Таймер, шифрование, класс файлов
«Это 16-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г.".
Об авторе
- об авторе
🍓 Домашняя страница блога:Домашняя страница автора
🍓 Введение: Высококлассный создатель в области JAVA🥇, младший в школе🎓, участвовал в различных провинциальных и национальных соревнованиях во время учебы и выиграл ряд наград🏆.
🍓 Следуйте за мной: Следуйте за мной, чтобы изучать материалы и загружать документы, а также регулярно обновлять статьи каждый день, чтобы стать старшим программистом JAVA 👨💻.
таймер
Основной ключевой технологией, которая движет развитием всего компьютерного оборудования, являются часы. Поэтому временные операции часто становятся центром внимания при разработке предприятия. Сам JDK также поддерживает эту операцию обработки планирования времени, которая не будет использоваться напрямую. Все еще связано с многопоточностью.
Если вы хотите регулярно планировать операции обработки, вам понадобятся два класса
- Запланированные задачи: java.util.TimerTask
- Операция планирования времени: java.util.Timer
package com.day14.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
class MyTask extends TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS").format(new Date()));
}
}
public class TaskDemo {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000,2000);
}
}
класс UUID
Класс UUID основан на вашем текущем адресе и метке времени для автоматического создания строки, которая почти никогда не повторяется.
package com.day14.demo;
import java.util.UUID;
public class UUIDDemo {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
}
}
В будущем класс UUID будет использоваться для простых имен файлов в аналогичных операциях, таких как загрузка файлов, чтобы предотвратить проблему дублирования имен.
Шифрование Base64
Base64 — это алгоритм шифрования данных, который использует весь алгоритм, чтобы обеспечить безопасную обработку наших данных. Если вы хотите выполнить обработку шифрования, вы можете использовать два: шифратор и дешифратор.
Шифрование
package com.day14.demo;
import java.util.Base64;
public class Base64Demo {
public static void main(String[] args) {
String msg = "123456";
String emsg = Base64.getEncoder().encodeToString(msg.getBytes());
System.out.println("加密:" + emsg);
byte[] decode = Base64.getDecoder().decode(emsg);
System.out.println("解密:" + new String(decode));
}
}
множественное шифрование
package com.day14.demo;
import java.util.Base64;
public class Base64Demo {
public static void main(String[] args) {
String msg = encode("123456");
String emsg = encode(encode(encode(msg)));
System.out.println("加密:" + emsg);
byte[] decode = Base64.getDecoder().decode(emsg);
System.out.println("解密:" + new String(decode));
}
public static String encode(String code){
return Base64.getEncoder().encodeToString(code.getBytes());
}
}
Другой способ - семенное дерево
package com.day14.demo;
import java.util.Base64;
public class Base64Demo {
public static void main(String[] args) {
String sed = encode("zsr--rsz");
String msg = "123456"+sed;
String emsg = encode(msg);
System.out.println("加密:" + emsg);
byte[] decode = Base64.getDecoder().decode(emsg);
System.out.println("解密:" + new String(decode));
}
public static String encode(String code){
return Base64.getEncoder().encodeToString(code.getBytes());
}
}
Длина должна быть гарантирована.Позднейшие разработки будут разрабатывать Base64 и MD5 вместе, а длина составляет 32 бита.
Класс ThreadLocal
Класс TheadLocal не наследует класс Thread и не реализует интерфейс Runable.Класс ThreadLocal поддерживает собственную уникальную копию переменных для каждого потока. Каждый поток имеет свою независимую переменную.
ThreadLocal использует метод «обмена пространства на время»: доступ распараллелен, а объекты монопольны. Первый предоставляет переменную только для разных потоков, ставящихся в очередь на доступ, а второй предоставляет переменную для каждого потока, поэтому к ним можно обращаться одновременно, не влияя друг на друга.
Реализация ThreadLocal следующая: каждый Thread поддерживает таблицу сопоставления ThreadLocalMap, а ключом этой таблицы сопоставления является сам экземпляр ThreadLocal. Значение — это переменная, которую действительно нужно сохранить. То есть сам ThreadLocal не хранит значение, он используется только как ключ для потока, чтобы получить значение из ThreadLocalMap. Обратите внимание, что ThreadLocalMap использует слабую ссылку ThreadLocal в качестве ключа, и объект со слабой ссылкой будет повторно использован во время GC.
Передавая параметры методу, вызывайте два потока для вывода разной информации.
package com.day14.demo;
class Message{
private String note;
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
};
}
class GetMessage{
public void print(Message msg){
System.out.println(Thread.currentThread().getName() + msg.getNote());
}
}
public class ThreadLocalDemo {
public static void main(String[] args) {
new Thread(()->{
Message message = new Message();
message.setNote("Hello,world!!");
new GetMessage().print(message);
},"用户A").start();
new Thread(()->{
Message message = new Message();
message.setNote("Hello,world!!zsr");
new GetMessage().print(message);
},"用户B").start();
}
}
Но мое текущее требование состоит в том, что я не хочу передавать метод печати в GetMessage, и я также хочу добиться той же функции.
package com.day14.demo;
class Message{
private String note;
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
};
}
class GetMessage{
public void print(){
System.out.println(Thread.currentThread().getName() + MyUtil.message.getNote());
}
}
class MyUtil{
public static Message message;
}
public class ThreadLocalDemo {
public static void main(String[] args) {
new Thread(()->{
Message msg = new Message();
msg.setNote("Hello,world!!");
MyUtil.message = msg;
new GetMessage().print();
},"用户A").start();
new Thread(()->{
Message msg = new Message();
msg.setNote("Hello,world!!zsr");
MyUtil.message = msg;
new GetMessage().print();
},"用户B").start();
}
}
Мы обнаружили, что содержимое двух потоков не выводится синхронно, поэтому мы подумаем об использовании класса ThreadLocal для решения проблемы этой асинхронности данных.
public class ThreadLocal<T> extends Object
В этом классе есть несколько важных методов:
- Получить данные: public T get()
- Данные магазина: общедоступный недействительный набор (значение T)
- Удалить данные: public void remove()
Используйте ThreadLocal для решения моей текущей проблемы
package com.day14.demo;
class Message{
private String note;
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
};
}
class GetMessage{
public void print(){
System.out.println(Thread.currentThread().getName() + MyUtil.get().getNote());
}
}
class MyUtil{
private static ThreadLocal<Message> tl = new ThreadLocal<Message>();
public static void set(Message msg){
tl.set(msg);
}
public static Message get(){
return tl.get();
}
}
public class ThreadLocalDemo {
public static void main(String[] args) {
new Thread(()->{
Message msg = new Message();
msg.setNote("Hello,world!!");
MyUtil.set(msg);
new GetMessage().print();
},"用户A").start();
new Thread(()->{
Message msg = new Message();
msg.setNote("Hello,world!!zsr");
MyUtil.set(msg);
new GetMessage().print();
},"用户B").start();
}
}
Таким образом, мы решаем проблему асинхронности данных.
IO — класс файла
Основная операция
Если вы хотите хорошо изучить ввод-вывод, вы должны иметь четкое представление об абстрактных классах и операционной части ввода-вывода, чтобы освоить две модели кода. Ядро IO состоит из пяти классов (File, OutputStream, InputStream, Writer, Reader) и одного интерфейса (Serializable).
Тогда java.io — это программа, связанная с работой самого текста (создание, удаление, получение информации---)
Если вы хотите использовать класс File для работы с файлами, вы должны создать экземпляр объекта класса File с помощью метода построения, и в процессе создания экземпляра объекта класса File в основном используются следующие два метода построения:
- Метод 1: общедоступный файл (строковый путь);
- Способ 2: общедоступный файл (родительский файл, дочерняя строка).
Основные операции с файлами в основном включают следующие функции:
-
Создать новый файл: Публичное логическое значение CreateNewFile () ВЫДАЕТ IOEXCEPTION
-
Удалить файлы: общедоступное логическое значение delete();
-
Проверить, существует ли путь: общественное логическое значение существует();
Создать новый файл
package com.day14.demo;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("f:\\hello.txt");
file.createNewFile();
}
}
Удалить, если файл существует, создать, если его нет
package com.day14.demo;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("f:\\hello.txt");
if(file.exists()){//文件存在
file.delete();
}else{//文件不存在
file.createNewFile();//创建文件
}
}
}
Работа этой программы означает, что если файл существует, он будет удален, и если оно не существует, будет создан новый файл. В настоящее время будет реализована основная функция, но в этой программе есть три проблемы в этой программе в этот раз:
Вопрос 1: О разделителе пути
В операционной системе Windows "\" используется в качестве разделителя пути, а "/" используется в качестве разделителя пути в системе Linux. В реальной разработке, в большинстве случаев, разработка будет выполняться в Windows, а затем проект будет Развернутый в Linux, то в это время необходимо изменить разделитель пути, что действительно проблематично в китайском языке, По этой причине в классе File предоставляется константа: public static final Stringseparator(Согласно соглашению об именах Java, глобальные константы должны быть определены прописными буквами, а здесь используются строчные буквы, что является проблемой, вызванной историей развития Java).
//由不同的操作系统的JVM来决定最终的separator是什么内容File file = new File("f:" + File.separator + "hello.txt");
Вопрос 2: Может быть проблема с задержкой
Обнаружено, что после завершения выполнения программы будут возникать некоторые операционные задержки при создании или удалении файлов.Если предположить, что сначала удаляется файл, а затем сразу определяется, существует ли файл, то возможный результат неверен (верно). ), все файлы *.class должны работать с операционной системой косвенно через JVM, поэтому могут возникнуть проблемы с задержкой.
Проблема 3: проблема с каталогом
Когда файл был создан ранее, он был создан в корневом каталоге.Что, если создаваемый файл теперь имеет каталог? Например, теперь, чтобы создать файл f:\hello\hello.txt, а каталог hello не существует на момент выполнения программы, при выполнении в это время появится сообщение об ошибке:
Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
Поскольку каталог сейчас не существует, его нельзя создать. В настоящее время необходимо сначала определить, существует ли родительский путь к файлу, который необходимо создать. Если он не существует, следует создать каталог, а затем создать файл , Чтобы выполнить такую операцию, вам необходимо Поддерживается несколько методов:
Найти родительский путь указанного файла: общедоступный файл getParentFile();
Создать каталог: общественное логическое значение mldirs().
package com.day14.demo;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
//由不同的操作系统的JVM来决定最终的separator是什么内容
File file = new File("f:" + File.separator +"hello" + File.separator + "hello.txt");
if(!file.getParentFile().exists()){//父目录
file.getParentFile().mkdirs();//创建父目录
}
if(file.exists()){//文件存在
file.delete();
}else{//文件不存在
file.createNewFile();//创建文件
}
}
}
В будущем при разработке любого класса java.io.File необходимо учитывать проблему каталога файлов.
Получить информацию о файле
В классе File вы также можете получить некоторую базовую информацию о файле с помощью следующих методов:
имя метода | описывать |
---|---|
public String getName() | получить имя файла |
public boolean isDirectory() | является ли данный путь папкой |
public boolean isFile() | является ли данный путь файлом |
public boolean isHidden() | Это скрытый файл |
public long lastModified() | Дата последнего изменения файла |
public long length() | Получите размер файла, возвращаемый в байтах. |
Получить информацию о размере файла и основную информацию
package com.day14.demo;
import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
class MyMath{
public static double round(double num, int scale){
return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale);
}
}
public class FileDemo2 {
public static void main(String[] args) {
File file = new File("f:" + File.separator + "701_03_支付宝沙箱使用.avi");
if(file.exists() && file.isFile()){
System.out.println("1文件大小为:" + MyMath.round(file.length() / (double) 1024 / 1024, 2));
System.out.println("最后一次修改日期:"+ new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
System.out.println("2文件大小为:" + new BigDecimal(file.length() / (double)1024 /1024).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP).doubleValue());
}
}
}
Список содержимого каталога: public File [] listFiles(), этот метод возвращает все файлы в каталоге в виде массива объектов File;
Список всех структур каталога
package com.day14.demo;
import java.io.File;
import java.util.Arrays;
public class FileDemo3 {
public static void main(String[] args) {
File file = new File("f:" + File.separator);
if(file.exists() && file.isDirectory()){
File[] listFiles = file.listFiles();
System.out.println(Arrays.toString(listFiles));
}
}
}
Комплексный кейс: список каталогов
Теперь я хочу перечислить все файлы в каталоге, поэтому в этом случае можно использовать только рекурсию: потому что после перечисления всех файлов или папок в каталоге, если найдено, что перечисленное содержимое является папкой, это должно быть Продолжить перечисление в обратном порядке.
Список всех файлов в указанном каталоге
package com.day14.demo;
import java.io.File;
public class FileListDemo {
public static void main(String[] args) {
File file = new File("f:" + File.separator);
list(file);
}
public static void list(File file){
if(file.isDirectory()){
File[] files = file.listFiles();
if(files != null){
for (int i = 0; i < files.length; i++) {
list(files[i]);//继续列出
}
}
}
System.out.println(file);
}
}
проблема блокировки потока
Теперь код выполняется в основном потоке.Если выполнение программы завершено, может быть выполнен следующий оператор.Чтобы решить эту трудоемкую проблему. Для публикации лучше создать новую тему.
package com.day14.demo;import java.io.File;public class FileListDemo { public static void main(String[] args) { new Thread(()->{ File file = new File("f:" + File.separator); list(file); },"列出线程").start(); System.out.println("开始进行文件信息列出。。。。"); } public static void list(File file){ if(file.isDirectory()){ File[] files = file.listFiles(); if(files != null){ for (int i = 0; i < files.length; i++) { list(files[i]);//继续列出 } } } System.out.println(file); }}