Le lieu de travail recueille des données sur l'atmosphère et les rayons ultraviolets avec une tarte aux framboises. Au départ, je l'ai copié localement avec WinSCP pour emprunter ces données, mais après l'avoir fait tant de fois J'étais tellement fatiguée que j'ai pensé à obtenir les données avec SFTP. Je vais écrire le code.
** SSH ** ... ** Communication cryptée ** ** FTP ** ... ** Protocole de transfert de fichiers **
** SSH + FTP = SFTP Transférer des fichiers en utilisant une communication cryptée SSH **
Actuellement, les données sont stockées dans Razpai comme ceci. Cette fois, je sortirai les données du fichier 20180716.csv.
Ajoutez la balise ** <dependency>
** de jsch dans la balise ** <dependencies>
** de pom.xml. Comme ça
pom.xml
<dependencies>
<!--JSch_adding_at_self_-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
</dependencies>
Le code est presque une copie de la page de référence.
test.java
import com.jcraft.jsch.*;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class test {
public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {
String host = "192.168.29.29";
int port = 22;
String user = "pi";
String password = "raspberry";
String dir = "/home/pi/iot/pressure/data/2018/";
String fileName = "20180716.csv";
JSch jsch;
Session session = null;
ChannelSftp channel = null;
FileInputStream fin = null;
BufferedInputStream bin = null;
try {
//Lien
jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setConfig("StrictHostKeyChecking", "no");//known_Ignorer la vérification des hôtes
session.setPassword(password);
session.connect();
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
channel.cd(dir);
//Télécharger
bin = new BufferedInputStream(channel.get(fileName));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int length;
while (true) {
length = bin.read(buf);
if (length == -1) {
break;
}
bout.write(buf, 0, length);
}
//Sortie standard
System.out.format("%1$s", new String(bout.toByteArray(), StandardCharsets.UTF_8));
}
finally {
if (fin != null) {
try {
fin.close();
}
catch (IOException e) {
}
}
if (bin != null) {
try {
bin.close();
}
catch (IOException e) {
}
}
if (channel != null) {
try {
channel.disconnect();
}
catch (Exception e) {
}
}
if (session != null) {
try {
session.disconnect();
}
catch (Exception e) {
}
}
}
}
}
Lançons-le. Le contenu du CSV a été exporté.
Maintenant, sortons les données dans un fichier local. Je viens d'écrire la sortie standard du code ci-dessus dans un fichier et je l'ai changé pour le contenu suivant.
test.java
import com.jcraft.jsch.*;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
public class test {
public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {
String host = "192.168.29.29";
int port = 22;
String user = "pi";
String password = "raspberry";
String dir = "/home/pi/iot/pressure/data/2018/";
String fileName = "20180716.csv";
JSch jsch;
Session session = null;
ChannelSftp channel = null;
FileInputStream fin = null;
BufferedInputStream bin = null;
try {
jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(password);
session.connect();
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
channel.cd(dir);
bin = new BufferedInputStream(channel.get(fileName));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int length;
while (true) {
length = bin.read(buf);
if (length == -1) {
break;
}
bout.write(buf, 0, length);
}
File file = new File("C:/tedkuma/BOX/★"+fileName);//Exporter vers un fichier
file.createNewFile();
FileWriter fw = new FileWriter(file);
fw.write(new String(bout.toByteArray()));
fw.close();
System.out.print("Sortie réussie");
}
finally {
if (fin != null) {
try {
fin.close();
}
catch (IOException e) {
}
}
if (bin != null) {
try {
bin.close();
}
catch (IOException e) {
}
}
if (channel != null) {
try {
channel.disconnect();
}
catch (Exception e) {
}
}
if (session != null) {
try {
session.disconnect();
}
catch (Exception e) {
}
}
}
}
}
La sortie s'affiche avec succès sur la console et un fichier avec une étoile est créé dans le répertoire cible.
Le contenu semble correct. Les mêmes données qu'auparavant sont sorties au format CSV.
Détourner le contenu de l'article que j'ai écrit l'autre jour Identifier les fichiers qui ont été mis à jour en 1 jour J'essaierai de ne sortir que les fichiers dans un délai d'un jour à compter de la date de mise à jour localement.
La page ChannelSftp.LsEntry sera utile. Vous pouvez recevoir les attributs de fichier de LsEntry avec getAttrs () et obtenir la date de modification avec getMTime ().
Je suis personnellement tombé sur les informations de la liste de fichiers lorsque j'ai reçu les informations du côté Raspeye. J'ai reçu une erreur (. Ou ..) autre que le fichier. Puisque le répertoire peut être déterminé par isDir (), il est traité s'il ne s'agit pas d'un répertoire.
test.java
import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
public class test {
public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {
String host = "192.168.29.29";
int port = 22;
String user = "pi";
String password = "raspberry";
String dir = "/home/pi/iot/pressure/data/2018/";
JSch jsch;
Session session = null;
ChannelSftp channel = null;
FileInputStream fin = null;
BufferedInputStream bin = null;
try {
jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(password);
session.connect();
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
channel.cd(dir);
Calendar st = Calendar.getInstance(); //Obtenez la date et l'heure actuelles avec la classe Calendar
st.add(Calendar.DATE, -1); //Obtenir il y a 1 jour
Date start = st.getTime(); //Changer de date
Calendar en = Calendar.getInstance();
en.add(Calendar.MINUTE, -10); //Obtenir il y a 10 minutes
Date end = en.getTime();
Vector<?> filelist = channel.ls(dir);
for(int i=0; i<filelist.size();i++){
LsEntry entry = (LsEntry) filelist.get(i);
String filename= entry.getFilename();
SftpATTRS attrs = entry.getAttrs();
Date lastModified = new Date(attrs.getMTime() * 1000L);
if(attrs.isDir()) {
//Si c'est un répertoire, ne faites rien
}if(start.compareTo(lastModified)<0 && end.compareTo(lastModified)>0){
bin = new BufferedInputStream(channel.get(filename));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int length;
while (true) {
length = bin.read(buf);
if (length == -1) {
break;
}
bout.write(buf, 0, length);
}
File file = new File("C:/tedkuma/★"+filename);
file.createNewFile();
FileWriter fw = new FileWriter(file);
fw.write(new String(bout.toByteArray()));
fw.close();
System.out.print("Sortie réussie");
}
}
}
finally {
if (fin != null) {
try {
fin.close();
}
catch (IOException e) {
}
}
if (bin != null) {
try {
bin.close();
}
catch (IOException e) {
}
}
if (channel != null) {
try {
channel.disconnect();
}
catch (Exception e) {
}
}
if (session != null) {
try {
session.disconnect();
}
catch (Exception e) {
}
}
}
}
}
Seuls les fichiers dans le jour suivant la modification sont copiés dans le répertoire cible avec les noms marqués de ★.
Puisque les données de la nuit dernière sont incluses, le contenu des données ne semble pas poser de problème.
Recommended Posts