Der Arbeitsplatz sammelt mit einem Himbeerkuchen Daten über die Atmosphäre und ultraviolette Strahlen. Anfangs habe ich es lokal mit WinSCP kopiert, um diese Daten auszuleihen, aber nachdem ich es so oft getan habe Ich war so müde, dass ich darüber nachdachte, die Daten mit SFTP abzurufen. Ich werde den Code aufschreiben.
** SSH ** ... ** Verschlüsselte Kommunikation ** ** FTP ** ... ** Dateiübertragungsprotokoll **
** SSH + FTP = SFTP Übertragen von Dateien mit SSH-verschlüsselter Kommunikation **
Derzeit werden Daten in Razpai wie folgt gespeichert. Dieses Mal werde ich die Daten der Datei 20180716.csv ausgeben.
Fügen Sie das ** <dependency>
** -Tag von jsch in das ** <dependencies>
** -Tag von pom.xml ein. So was
pom.xml
<dependencies>
<!--JSch_adding_at_self_-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
</dependencies>
Der Code ist fast eine Kopie der Referenzseite.
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 {
//Verbindung
jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setConfig("StrictHostKeyChecking", "no");//known_Hosts überspringen
session.setPassword(password);
session.connect();
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
channel.cd(dir);
//herunterladen
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);
}
//Standardausgabe
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) {
}
}
}
}
}
Lass es uns laufen. Der Inhalt von CSV wurde exportiert.
Lassen Sie uns nun die Daten in eine lokale Datei ausgeben. Ich habe gerade die Standardausgabe des obigen Codes in eine Datei geschrieben und sie in den folgenden Inhalt geändert.
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);//In Datei exportieren
file.createNewFile();
FileWriter fw = new FileWriter(file);
fw.write(new String(bout.toByteArray()));
fw.close();
System.out.print("Ausgabe erfolgreich");
}
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) {
}
}
}
}
}
Der Inhalt scheint in Ordnung zu sein. Die gleichen Daten wie zuvor werden im CSV-Format ausgegeben.
Umleiten des Inhalts des Artikels, den ich neulich geschrieben habe Identifizieren Sie Dateien, die innerhalb eines Tages aktualisiert wurden Ich werde versuchen, nur die Dateien innerhalb eines Tages nach dem Aktualisierungsdatum lokal auszugeben.
Die Seite ChannelSftp.LsEntry ist hilfreich. Sie können das Attribut der Datei mit getAttrs () von LsEntry abrufen und das Änderungsdatum mit getMTime () abrufen.
Ich bin persönlich auf die Informationen in der Dateiliste gestoßen, als ich die Informationen auf der Raspeye-Seite erhielt. Ich habe einen anderen Fehler (. Oder ..) als die Datei erhalten. Da das Verzeichnis von isDir () bestimmt werden kann, wird es verarbeitet, wenn es kein Verzeichnis ist.
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(); //Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit mit der Kalenderklasse
st.add(Calendar.DATE, -1); //Holen Sie sich vor 1 Tag
Date start = st.getTime(); //Zum Datum wechseln
Calendar en = Calendar.getInstance();
en.add(Calendar.MINUTE, -10); //
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()) {
//Wenn es sich um ein Verzeichnis handelt, tun Sie nichts
}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("Ausgabe erfolgreich");
}
}
}
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) {
}
}
}
}
}
Nur Dateien innerhalb eines Tages nach der Änderung werden mit den mit ★ gekennzeichneten Namen in das Zielverzeichnis kopiert.
Da die Daten der letzten Nacht enthalten sind, scheint der Inhalt der Daten kein Problem zu sein.
Recommended Posts